Zend_Locale-Parsing.xml 22 KB

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