Zend_Locale-Parsing.xml 21 KB

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