Zend_Locale-Parsing.xml 22 KB

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