Zend_Locale-Parsing.xml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 22755 -->
  3. <!-- Reviewed: 22755 -->
  4. <sect1 id="zend.locale.parsing">
  5. <title>Normalisierung und Lokalisierung</title>
  6. <para>
  7. <classname>Zend_Locale_Format</classname> ist eine interne Komponente, welche von
  8. <classname>Zend_Locale</classname> verwendet wird. Alle lokalisierbaren Klassen benutzen
  9. <classname>Zend_Locale_Format</classname> für Normalisierung und Lokalisierung von Nummern
  10. und Daten. Normalisierung beinhaltet das Analysieren von Eingaben von einer Vielfalt von
  11. Werten wie Datumswerten in eine standardisierte, strukturieren Art wie zum Beispiel ein
  12. <acronym>PHP</acronym> Array mit Jahr, Monat und Tages Elementen.
  13. </para>
  14. <para>
  15. Genau die gleiche Zeichenkette, die eine Zahl oder ein Datum enthält, kann verschiedenes
  16. bedeuten für Leute mit unterschiedlichen Gebräuchen und Konventionen.
  17. Das Auflösen von Mehrdeutigkeiten von Nummern und Daten benötigt
  18. Regeln darüber, wie diese Zeichenketten zu interpretieren sind um diese Werte in eine
  19. standardisierte Form zu bringen. Deswegen benötigen alle Methoden in
  20. <classname>Zend_Locale_Format</classname> ein Gebietsschema, um Eingabedaten analysieren zu
  21. können.
  22. <note>
  23. <title>Standard "root" Gebietsschema</title>
  24. <para>
  25. Wenn kein Gebietsschema spezifiziert wurde, wird die Normalisierung und
  26. Lokalisierung das Standard "root" Gebietsschema verwenden, was zu unerwarteten
  27. Ergebnissen führen kann, wenn die Eingabe in einem anderen Gebietsschema angegeben
  28. oder die Ausgabe für ein anderes Gebietsschema erwartet wurde.
  29. </para>
  30. </note>
  31. </para>
  32. <sect2 id="zend.locale.number.normalize">
  33. <title>Normalisierung von Zahlen: getNumber($input, Array $options)</title>
  34. <para>
  35. Es gibt viele
  36. <ulink url="http://en.wikipedia.org/wiki/Numeral">Ziffernsysteme</ulink>,
  37. welche sich vom üblichen
  38. <ulink url="http://en.wikipedia.org/wiki/Decimal">Dezimalsystem</ulink>
  39. unterscheiden (z.B. "3.14"). Zahlen können mit der Funktion
  40. <methodname>getNumber()</methodname> normalisiert werden, um ein gleichwertiges Ergebnis
  41. in einer Schreibweise des Standarddezimalsystems zu erhalten. Für alle
  42. Ziffern-relevanten Diskussionen in diesem Handbuch werden die
  43. <ulink url="http://en.wikipedia.org/wiki/Arabic_numerals">Arabisch/Europäischen Ziffern
  44. (0,1,2,3,4,5,6,7,8,9)</ulink> verwendet, ausser es ist anders definiert. Das
  45. Options-Array kann ein 'locale'.Gebietsschema enthalten, um eine Gruppierung und
  46. Kommazeichen zu definieren. Das Array kann auch eine Genauigkeit 'precision' enthalten,
  47. um überschüssige Ziffern vom Ergebnis abzuschneiden.
  48. </para>
  49. <example id="zend.locale.number.normalize.example-1">
  50. <title>Normalisieren von Zahlen</title>
  51. <programlisting language="php"><![CDATA[
  52. $locale = new Zend_Locale('de_AT');
  53. $number = Zend_Locale_Format::getNumber('13.524,678',
  54. array('locale' => $locale,
  55. 'precision' => 3)
  56. );
  57. print $number; // wird 13524.678 zurückgeben
  58. ]]></programlisting>
  59. </example>
  60. <sect3 id="zend.locale.number.normalize.precision">
  61. <title>Genauigkeit und Berechnungen</title>
  62. <para>
  63. Da <methodname>getNumber($value, array $options = array())</methodname> extrem große
  64. Zahlen lokalisieren kann, sollte das Ergebnis sorgfältig geprüft werden, bevor
  65. endlich genaue Berechnungen wie normale mathematische <acronym>PHP</acronym>
  66. Operationen gemacht werden. Zum Beispiel
  67. <command>if ((string)int_val($number) != $number) { </command> benutze <ulink
  68. url="http://www.php.net/bc">BCMath</ulink> oder
  69. <ulink url="http://www.php.net/gmp">GMP</ulink>. Die meisten PHP
  70. Installationen unterstützen die BCMath Erweiterung.
  71. </para>
  72. <para>
  73. Auch die Genauigkeit des dezimalen Ergebnisses bei
  74. <methodname>getNumber()</methodname> kann mit der Option'<property>precision</property>'
  75. '<property>precision</property>' zu einer gewünschten Länge abgerundet
  76. werden. Wenn keine Genauigkeit angegeben wurde, wird nicht abgerundet.
  77. Für die Angabe der Genauigkeit dürfen nur <acronym>PHP</acronym> Integer
  78. Zahlen verwendet werden. Das Ergebnis wird nicht gerundet. Deswegen wird "1.6" auch
  79. "1" und nicht "2" zurückgeben, wenn als Genauigkeit null angegeben wurde.
  80. </para>
  81. <para>
  82. Wenn das dezimale Ergebnis zu einer gewünschten Länge abgeschnitten statt gerundet
  83. werden soll kann stattdessen die Option '<property>number_format</property>'
  84. verwendet werden. Die Länge des gewünschten dezimalen Ergebnisses kann mit der
  85. gewünschten Länge von Nullen bestimmt werden. Das Ergebnis wird dann nicht gerundet.
  86. Wenn also die definierte Genauigkeit innerhalb von
  87. <property>number_format</property> Null ist wird "1.6" den Wert "1" und nicht "2"
  88. zurückgeben. Siehe das folgende Beispiel:
  89. </para>
  90. <example id="zend.locale.number.normalize.precision.example-1">
  91. <title>Normalisierung von Zahlen mit Genauigkeit</title>
  92. <programlisting language="php"><![CDATA[
  93. $locale = new Zend_Locale('de_AT');
  94. $number = Zend_Locale_Format::getNumber('13.524,678',
  95. array('precision' => 1,
  96. 'locale' => $locale)
  97. );
  98. print $number; // will 13524.7 zurückgeben
  99. $number = Zend_Locale_Format::getNumber('13.524,678',
  100. array('number_format' => '#.00',
  101. 'locale' => $locale)
  102. );
  103. print $number; // will 13524.67 zurückgeben
  104. ]]></programlisting>
  105. </example>
  106. </sect3>
  107. </sect2>
  108. <sect2 id="zend.locale.number.localize">
  109. <title>Lokalisieren von Zahlen</title>
  110. <para>
  111. <methodname>toNumber($value, array $options = array())</methodname> kann mit Hilfe der
  112. folgenden <link linkend="zend.locale.appendix">unterstützten Gebietsschemata</link>,
  113. Zahlen lokalisieren. Diese Funktion gibt eine lokalisierte Zeichenkette der angegebenen
  114. Zahl in dem konventionellen Format für ein definiertes Gebietsschema aus. Die Option
  115. 'number_format' definiert ein explizit angegebenes, nicht standardmäßiges Zahlenformat
  116. für die Verwendung mit <methodname>toNumber()</methodname>.
  117. </para>
  118. <example id="zend.locale.number.localize.example-1">
  119. <title>Lokalisieren von Zahlen</title>
  120. <programlisting language="php"><![CDATA[
  121. $locale = new Zend_Locale('de_AT');
  122. $number = Zend_Locale_Format::toNumber(13547.36,
  123. array('locale' => $locale));
  124. // gibt 13.547,36 zurück
  125. print $number;
  126. ]]></programlisting>
  127. </example>
  128. <para>
  129. <note>
  130. <title>Unlimitierte Länge</title>
  131. <para>
  132. <methodname>toNumber()</methodname> kann Zahlen mit unendlicher Länge
  133. lokalisieren. Hierbei gibt es keine Abhängigkeiten mit Integer oder Float
  134. Limits.
  135. </para>
  136. </note>
  137. </para>
  138. <para>
  139. Genauso wie <methodname>getNumber()</methodname> verwendet
  140. <methodname>toNumber()</methodname> die Genauigkeit. Wenn keine Genauigkeit angegeben
  141. wurde, wird die komplette lokalisierte Zahl zurückgegeben.
  142. </para>
  143. <example id="zend.locale.number.localize.example-2">
  144. <title>Zahlen mit bestimmter Genauigkeit lokalisieren</title>
  145. <programlisting language="php"><![CDATA[
  146. $locale = new Zend_Locale('de_AT');
  147. $number = Zend_Locale_Format::toNumber(13547.3678,
  148. array('precision' => 2,
  149. 'locale' => $locale));
  150. // gibt 13.547,37 zurück
  151. print $number;
  152. ]]></programlisting>
  153. </example>
  154. <para>
  155. Wird die Option 'number_format' benutzt, kann ein selbst definiertes Format für das
  156. erstellen der Zahl definiert werden. Das Format selbst muß im <acronym>CLDR</acronym>
  157. Format wie anbei beschrieben angegeben werden. Das Gebietsschema wird hierbei benutzt um
  158. das Trennzeichen, die Genauigkeit und andere Formatierungszeichen für Zahlen zu
  159. erhalten. Deutsch definiert zum Beispiel ',' als Kommazeichen und im Englischen wird das
  160. '.' Zeichen benutzt.
  161. </para>
  162. <table id="zend.locale.number.localize.table-1">
  163. <title>Definitionen für selbst erzeugte Zahlenformate</title>
  164. <tgroup cols="4">
  165. <thead>
  166. <row>
  167. <entry>Definition</entry>
  168. <entry>Beschreibung</entry>
  169. <entry>Beispiel Format</entry>
  170. <entry>Erzeugte Ausgabe</entry>
  171. </row>
  172. </thead>
  173. <tbody>
  174. <row>
  175. <entry>#0</entry>
  176. <entry>Erzeugt eine Zahl ohne Genauigkeit und ohne Trennung</entry>
  177. <entry>#0</entry>
  178. <entry>1234567</entry>
  179. </row>
  180. <row>
  181. <entry>,</entry>
  182. <entry>
  183. Erzeugt eine Trennung mit der Länge von einem Trennzeichen zum nächsten
  184. oder zur 0
  185. </entry>
  186. <entry>#,##0</entry>
  187. <entry>1,234,567</entry>
  188. </row>
  189. <row>
  190. <entry>#,##,##0</entry>
  191. <entry>
  192. Erzeugt eine Standardtrennung von 3 und alle weiteren Trennungen mit 2
  193. </entry>
  194. <entry>#,##,##0</entry>
  195. <entry>12,34,567</entry>
  196. </row>
  197. <row>
  198. <entry>.</entry>
  199. <entry>Erzeugt eine Kommazahl</entry>
  200. <entry>#0.#</entry>
  201. <entry>1234567.1234</entry>
  202. </row>
  203. <row>
  204. <entry>0</entry>
  205. <entry>Erzeugt eine Kommazahl mit definierter Länge</entry>
  206. <entry>#0.00</entry>
  207. <entry>1234567.12</entry>
  208. </row>
  209. </tbody>
  210. </tgroup>
  211. </table>
  212. <example id="zend.locale.number.localize.example-3">
  213. <title>Ein selbst definiertes Zahlenformat verwenden</title>
  214. <programlisting language="php"><![CDATA[
  215. $locale = new Zend_Locale('de_AT');
  216. $number = Zend_Locale_Format::toNumber(13547.3678,
  217. array('number_format' => '#,#0.00',
  218. 'locale' => 'de')
  219. );
  220. // gibt 1.35.47,36 zurück
  221. print $number;
  222. $number = Zend_Locale_Format::toNumber(13547.3,
  223. array('number_format' => '#,##0.00',
  224. 'locale' => 'de')
  225. );
  226. // gibt 13.547,30 zurück
  227. print $number;
  228. ]]></programlisting>
  229. </example>
  230. </sect2>
  231. <sect2 id="zend.locale.number.test">
  232. <title>Testen von Zahlen</title>
  233. <para>
  234. <methodname>isNumber($value, array $options = array())</methodname> prüft, ob eine
  235. gegebene Zeichenkette eine Zahl enthält und gibt <constant>TRUE</constant> oder
  236. <constant>FALSE</constant> zurück.
  237. </para>
  238. <example id="zend.locale.number.test.example-1">
  239. <title>Testen von Zahlen</title>
  240. <programlisting language="php"><![CDATA[
  241. $locale = new Zend_Locale();
  242. if (Zend_Locale_Format::isNumber('13.445,36', array('locale' => 'de_AT')) {
  243. print "Zahl";
  244. } else {
  245. print "keine Zahl";
  246. }
  247. ]]></programlisting>
  248. </example>
  249. </sect2>
  250. <sect2 id="zend.locale.float.normalize">
  251. <title>Gleitkommazahlen normalisieren</title>
  252. <para>
  253. Lokalisierte Gleitkommazahlen können mit <code>getFloat($value, array $options =
  254. array())</code> analysiert werden. Es wird eine Gleitkommazahl zurückgegeben.
  255. </para>
  256. <example id="zend.locale.float.normalize.example-1">
  257. <title>Gleitkommazahlen normalisieren</title>
  258. <programlisting language="php"><![CDATA[
  259. $locale = new Zend_Locale('de_AT');
  260. $number = Zend_Locale_Format::getFloat('13.524,678',
  261. array('precision' => 2,
  262. 'locale' => $locale));
  263. // gibt 13524.68 zurück
  264. print $number;
  265. ]]></programlisting>
  266. </example>
  267. </sect2>
  268. <sect2 id="zend.locale.float.localize">
  269. <title>Lokalisieren von Gleitkommazahlen</title>
  270. <para>
  271. <methodname>toFloat()</methodname> kann Gleitkommazahlen lokalisieren. Diese Funktion
  272. gibt eine lokalisierte Zeichenkette mit der gegebenen Zahl zurück.
  273. </para>
  274. <example id="zend.locale.float.localize.example-1">
  275. <title>Lokalisieren von Gleitkommazahlen</title>
  276. <programlisting language="php"><![CDATA[
  277. $locale = new Zend_Locale('de_AT');
  278. $number = Zend_Locale_Format::toFloat(13547.3655,
  279. array('precision' => 1,
  280. 'locale' => $locale));
  281. // gibt 13.547,4 zurück
  282. print $number;
  283. ]]></programlisting>
  284. </example>
  285. </sect2>
  286. <sect2 id="zend.locale.float.test">
  287. <title>Testen von Gleitkommazahlen</title>
  288. <para>
  289. <methodname>isFloat($value, array $options = array())</methodname> prüft, ob eine
  290. gegebene Zeichenkette eine Gleitkommazahl enthält und gibt <constant>TRUE</constant>
  291. oder <constant>FALSE</constant> zurück.
  292. </para>
  293. <example id="zend.locale.float.test.example-1">
  294. <title>Testen von Gleitkommazahlen</title>
  295. <programlisting language="php"><![CDATA[
  296. $locale = new Zend_Locale('de_AT');
  297. if (Zend_Locale_Format::isFloat('13.445,36', array('locale' => $locale)) {
  298. print "Gleitkommazahl";
  299. } else {
  300. print "keine Gleitkommazahl";
  301. }
  302. ]]></programlisting>
  303. </example>
  304. </sect2>
  305. <sect2 id="zend.locale.integer.normalize">
  306. <title>Integer-Zahlen normalisieren</title>
  307. <para>
  308. Ganzzahlen können mit der Funktion <methodname>getInteger()</methodname> analysiert
  309. werden. Es wird ein Ganzzahlwert (Integer) zurückgegeben.
  310. </para>
  311. <example id="zend.locale.integer.normalize.example-1">
  312. <title>Normalisieren von Integer-Zahlen</title>
  313. <programlisting language="php"><![CDATA[
  314. $locale = new Zend_Locale('de_AT');
  315. $number = Zend_Locale_Format::getInteger('13.524,678',
  316. array('locale' => $locale));
  317. // gibt 13524 zurück
  318. print $number;
  319. ]]></programlisting>
  320. </example>
  321. </sect2>
  322. <sect2 id="zend.locale.integer.localize">
  323. <title>Lokalisieren von Ganzzahlen</title>
  324. <para>
  325. <methodname>toInteger($value, array $options = array())</methodname> kann Integer-Zahlen
  326. lokalisieren. Diese Funktion gibt eine lokalisierte Zeichenkette anhand der gegebenen
  327. Nummer zurück.
  328. </para>
  329. <example id="zend.locale.integer.localize.example-1">
  330. <title>Lokalisieren von Integer-Zahlen</title>
  331. <programlisting language="php"><![CDATA[
  332. $locale = new Zend_Locale('de_AT');
  333. $number = Zend_Locale_Format::toInteger(13547.3655,
  334. array('locale' => $locale));
  335. // gibt 13.547 zurück
  336. print $number;
  337. ]]></programlisting>
  338. </example>
  339. </sect2>
  340. <sect2 id="zend.locale.integer.test">
  341. <title>Testen von Integer-Zahlen</title>
  342. <para>
  343. <methodname>isInteger($value, array $options = array())</methodname> prüft ob eine
  344. gegebene Zeichenkette eine Ganzzahl enthält und gibt <constant>TRUE</constant> oder
  345. <constant>FALSE</constant> zurück.
  346. </para>
  347. <example id="zend.locale.integer.test.example-1">
  348. <title>Testen von Integer-Zahlen</title>
  349. <programlisting language="php"><![CDATA[
  350. $locale = new Zend_Locale('de_AT');
  351. if (Zend_Locale_Format::isInteger('13.445', array('locale' => $locale)) {
  352. print "Integerzahl";
  353. } else {
  354. print "keine Integerzahl";
  355. }
  356. ]]></programlisting>
  357. </example>
  358. </sect2>
  359. <sect2 id="zend.locale.numbersystems">
  360. <title>Konvertieren von Zahlensystemen</title>
  361. <para>
  362. <methodname>Zend_Locale_Format::convertNumerals()</methodname> kann die Ziffern zwischen
  363. den unterschiedlichen <ulink
  364. url="http://en.wikipedia.org/wiki/Arabic_numerals">Zahlensystemen</ulink> umwandeln.
  365. Das inkludiert auch das Standard Arabisch/Europäisch/Lateinische Zahlensystem
  366. (0,1,2,3,4,5,6,7,8,9). Nicht zu verwechseln mit dem
  367. <ulink url="http://en.wikipedia.org/wiki/Eastern_Arabic_numerals">Ost-arabischen
  368. Zahlensystem</ulink>, welches in der Arabischen Sprache benutzt wird, um Zahlen zu
  369. schreiben. Der Versuch, ein nicht unterstütztes Zahlensystem zu benutzen, führt zu einer
  370. Ausnahme, um eine irrtümliche falsche Konvertierung wegen eines Schreibfehlers zu
  371. verhindern. Alle Zeichen der Eingabe, welche keine Ziffern des angegebenen
  372. Zahlenformates sind, werden in den Ausgabestring kopiert ohne dass sie verändert werden.
  373. Das beinhaltet auch die Trennzeichen der Zahlen. <classname>Zend_Locale</classname>*
  374. Komponenten sind abhängig von den Daten, welche durch <acronym>CLDR</acronym> zur
  375. Verfügung gestellt werden (hier ist eine <ulink
  376. url="http://unicode.org/cldr/data/diff/supplemental/languages_and_scripts.html?sortby=date">Liste
  377. von Schreibweisen gruppiert nach Sprachen</ulink>).
  378. </para>
  379. <para>
  380. Im <acronym>CLDR</acronym> und auch hier, werden die Europäisch/Lateinischen Zahlen als
  381. "Latin" oder mit dem zugeordneten 4-Zeichen-Code "Latn" bezeichnet. Im
  382. <acronym>CLDR</acronym> werden Zahlensysteme auch als "Schreibweisen" (Scripts)
  383. bezeichnet.
  384. </para>
  385. <para>
  386. Nehmen wir an eine Web-Form erhält eine numerische Eingabe, welche Ost-Arabische
  387. Ziffern enthält "١‎٠٠". Die meisten Programme und <acronym>PHP</acronym>-Funktionen
  388. erwarten Eingaben aber als Lateinische Ziffern. Glücklicherweise ist die
  389. Konvertierung dieser Eingabe in gleichwertige Lateinische Ziffern "100" sehr wenig
  390. Aufwand. Es muss nur <code>convertNumerals($inputNumeralString, $sourceNumeralSystem,
  391. $destNumeralSystem)</code> benutzt werden, welches <varname>$input</varname>
  392. zurückgibt und hierbei die Ziffern der Schreibweise
  393. <varname>$sourceNumeralSystem</varname> in die Schreibweise
  394. <varname>$destNumeralSystem</varname> konvertiert.
  395. </para>
  396. <example id="zend.locale.numbersystems.example-1">
  397. <title>Konvertieren von Ost-Arabischen Ziffern in Europäisch-Lateinische Ziffern</title>
  398. <programlisting language="php"><![CDATA[
  399. $arabicScript = "١‎٠٠"; // Arabisch für "100" (ein Hundert)
  400. $latinScript = Zend_Locale_Format::convertNumerals($arabicScript,
  401. 'Arab',
  402. 'Latn');
  403. print "\nOriginal: " . $arabicScript;
  404. print "\nNormalisiert: " . $latinScript;
  405. ]]></programlisting>
  406. </example>
  407. <para>
  408. Genauso kann jedes unterstützte Zahlensystem in jedes andere unterstützte Zahlensystem
  409. konvertiert werden.
  410. </para>
  411. <example id="zend.locale.numbersystems.example-2">
  412. <title>Konvertieren von Lateinischen Ziffern in Ost-Arabische Ziffern</title>
  413. <programlisting language="php"><![CDATA[
  414. $latinScript = '123';
  415. $arabicScript = Zend_Locale_Format::convertNumerals($latinScript,
  416. 'Latn',
  417. 'Arab');
  418. print "\nOriginal: " . $latinScript;
  419. print "\nLokalisiert: " . $arabicScript;
  420. ]]></programlisting>
  421. </example>
  422. <example id="zend.locale.numbersystems.example-3">
  423. <title>
  424. Auslesen des 4 Zeichen CLDR Codes durch Benutzen des Namens in der Muttersprache
  425. </title>
  426. <programlisting language="php"><![CDATA[
  427. function getScriptCode($scriptName, $locale)
  428. {
  429. $scripts2names = Zend_Locale_Data::getList($locale, 'scriptlist');
  430. $names2scripts = array_flip($scripts2names);
  431. return $names2scripts[$scriptName];
  432. }
  433. echo getScriptCode('Latin', 'en'); // Ausgabe "Latn"
  434. echo getScriptCode('Tamil', 'en'); // Ausgabe "Taml"
  435. echo getScriptCode('tamoul', 'fr'); // Ausgabe "Taml"
  436. ]]></programlisting>
  437. </example>
  438. <para>
  439. Für eine Liste der unterstützten Zahlensysteme kann man
  440. <methodname>Zend_Locale::getTranslationList('numberingsystem', 'en')</methodname>
  441. aufrufen.
  442. </para>
  443. </sect2>
  444. </sect1>