1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20792 -->
4 <sect1 id="zend.locale.parsing">
6 <title>正規化および地域化</title>
9 <classname>Zend_Locale_Format</classname> は、<classname>Zend_Locale</classname> が内部で使用しているコンポーネントです。
10 ロケール対応のクラスは、<classname>Zend_Locale_Format</classname>
11 を用いて数値や日付の正規化および地域化を行います。
12 正規化とは、さまざまな形式で表されるデータ (日付など) を取り込んで解析し、
13 標準化された構造化表現 (year、month、day の各要素からなる配列など) に変換することです。
18 異なる習慣や規約を使用している人が見ると異なる意味にとられることがあります。
19 数値や日付を、あいまいさをなくして正確に解釈するには、
20 これらの文字列を正規化し、標準化されたデータ構造に変換する必要があります。
21 したがって、<classname>Zend_Locale_Format</classname> のすべてのメソッドは、
22 入力データを処理するためにロケール情報を必要とします。
24 <title>デフォルトの "root" ロケール</title>
26 ロケールを省略した場合は、正規化や地域化の際に
27 標準の "root" ロケールを使用します。
28 これは予期せぬ動作を引き起こす可能性があります。
29 さまざまなロケールの入力を扱ったり、特定のロケールで出力したい場合などに注意が必要です。
34 <sect2 id="zend.locale.number.normalize">
36 <title>数値の正規化: getNumber($input, Array $options)</title>
40 <ulink url="http://en.wikipedia.org/wiki/Decimal">十進形式</ulink>
42 <ulink url="http://en.wikipedia.org/wiki/Numeral">数値形式</ulink>
44 数値を正規化するには <methodname>getNumber()</methodname>
45 関数を使用します。これは、標準の十進形式を返します。
46 このマニュアルにおける数値関連の説明はすべて、特にことわりがない限り
47 <ulink url="http://en.wikipedia.org/wiki/Arabic_numerals">アラビア数字 (0,1,2,3,4,5,6,7,8,9)</ulink>
48 を想定したものです。オプションの配列で 'locale'
49 を指定し、桁区切り文字および小数点を定義できます。
50 また、配列に 'precision' を指定すると、
54 <example id="zend.locale.number.normalize.example-1">
56 <programlisting language="php"><![CDATA[
57 $locale = new Zend_Locale('de_AT');
58 $number = Zend_Locale_Format::getNumber('13.524,678',
59 array('locale' => $locale,
63 print $number; // 13524.678 を返します
67 <sect3 id="zend.locale.number.normalize.precision">
72 <methodname>getNumber($value, array $options = array())</methodname> では非常に大きな数値も正規化できるので、
73 <acronym>PHP</acronym> の通常の数値計算のように精度が限られている計算をする前には注意しましょう。
75 ((string)int_val($number) != $number) {
76 <ulink url="http://www.php.net/bc">BCMath</ulink>
78 <ulink url="http://www.php.net/gmp">GMP</ulink>
81 実際にインストールされている <acronym>PHP</acronym> のほとんどは、
82 BCMath 拡張モジュールをサポートしています。
86 また、結果の十進表現の精度も、<methodname>getNumber()</methodname>
87 のオプション <code>'precision'</code> で指定した長さに丸められます。
88 精度を指定しなかった場合は、丸め処理は行われません。
89 精度を指定するには、<acronym>PHP</acronym> の整数のみを使用します。
93 十進表現で表した結果を丸めるのではなく指定した桁数で切り詰めたい場合は、
94 オプション <code>'number_format'</code> を代わりに使用します。
95 十進表現の精度を定義するには、必要な桁数ぶんのゼロを指定します。
96 結果の丸めは行われません。つまり、もし <code>number_format</code>
98 "1.6" は "1" であり、"2" とはなりません。
102 <example id="zend.locale.number.normalize.precision.example-1">
103 <title>精度を指定した数値の正規化</title>
104 <programlisting language="php"><![CDATA[
105 $locale = new Zend_Locale('de_AT');
106 $number = Zend_Locale_Format::getNumber('13.524,678',
107 array('precision' => 1,
110 print $number; // 13524.7 を返します
112 $number = Zend_Locale_Format::getNumber('13.524,678',
113 array('number_format' => '#.00',
116 print $number; // 13524.67 を返します
124 <sect2 id="zend.locale.number.localize">
126 <title>数値の地域化</title>
129 <methodname>toNumber($value, array $options = array())</methodname> は、
130 <link linkend="zend.locale.appendix">サポートするロケール</link>
132 この関数は、指定した数値を、特定のロケールにあわせて書式化した文字列を返します。
133 オプション 'number_format' を使用すると、
134 <methodname>toNumber()</methodname> で用いるデフォルト以外の数値書式を設定できます。
137 <example id="zend.locale.number.localize.example-1">
138 <title>数値の地域化</title>
139 <programlisting language="php"><![CDATA[
140 $locale = new Zend_Locale('de_AT');
141 $number = Zend_Locale_Format::toNumber(13547.36,
142 array('locale' => $locale));
151 <title>長さは無制限</title>
153 <methodname>toNumber()</methodname> が地域化できる数値の長さには制限がありません。
154 整数や浮動小数点数の範囲の制限を受けることはありません。
160 <methodname>getNumber()</methodname> と同様の方法で、
161 <methodname>toNumber()</methodname> も精度を扱います。
162 精度を指定しなかった場合は、地域化した数値を完全な状態で返します。
165 <example id="zend.locale.number.localize.example-2">
166 <title>精度を指定した数値の地域化</title>
167 <programlisting language="php"><![CDATA[
168 $locale = new Zend_Locale('de_AT');
169 $number = Zend_Locale_Format::toNumber(13547.3678,
170 array('precision' => 2,
171 'locale' => $locale));
179 オプション 'number_format' を使用すると、
181 書式を指定するには、以下の <acronym>CLDR</acronym> 書式を使用します。
182 ロケールを元に、桁区切りや小数点、その他の数値記号を取得します。
184 ',' を用いますが、英語では小数点に '.' を使用します。
187 <table id="zend.locale.number.localize.table-1">
188 <title>自分で作成する数値書式用の書式トークン
202 <entry>桁区切りや小数点のない数値を生成します。</entry>
204 <entry>1234567</entry>
208 <entry>指定した桁数ごとに区切り文字を生成します。</entry>
210 <entry>1,234,567</entry>
213 <entry>#,##,##0</entry>
214 <entry>最初は標準の 3 桁で区切り、それ以降は 2 桁ごとに区切ります。</entry>
215 <entry>#,##,##0</entry>
216 <entry>12,34,567</entry>
220 <entry>小数点を生成します。</entry>
222 <entry>1234567.1234</entry>
226 <entry>小数点以下を指定した桁数にします。</entry>
228 <entry>1234567.12</entry>
234 <example id="zend.locale.number.localize.example-3">
235 <title>自分で定義した数値書式の使用</title>
236 <programlisting language="php"><![CDATA[
237 $locale = new Zend_Locale('de_AT');
238 $number = Zend_Locale_Format::toNumber(13547.3678,
239 array('number_format' => '#,#0.00',
246 $number = Zend_Locale_Format::toNumber(13547.3,
247 array('number_format' => '#,##0.00',
258 <sect2 id="zend.locale.number.test">
260 <title>数値かどうかの確認</title>
263 <methodname>isNumber($value, array $options = array())</methodname> は、指定した文字列が数値であるかどうかを
264 <constant>TRUE</constant> あるいは <constant>FALSE</constant> で返します。
267 <example id="zend.locale.number.test.example-1">
268 <title>数値かどうかの確認</title>
269 <programlisting language="php"><![CDATA[
270 $locale = new Zend_Locale();
271 if (Zend_Locale_Format::isNumber('13.445,36', array('locale' => 'de_AT')) {
281 <sect2 id="zend.locale.float.normalize">
283 <title>浮動小数点値の正規化</title>
286 浮動小数点値のパースには <methodname>getFloat($value, array $options = array())</methodname>
287 関数を使用します。これは、浮動小数点値を返します。
290 <example id="zend.locale.float.normalize.example-1">
291 <title>浮動小数点値の正規化</title>
292 <programlisting language="php"><![CDATA[
293 $locale = new Zend_Locale('de_AT');
294 $number = Zend_Locale_Format::getFloat('13.524,678',
295 array('precision' => 2,
306 <sect2 id="zend.locale.float.localize">
308 <title>浮動小数点値の地域化</title>
311 <methodname>toFloat()</methodname> は、浮動小数点値の地域化を行います。
312 この関数は、指定した数値を地域化した文字列を返します。
315 <example id="zend.locale.float.localize.example-1">
316 <title>浮動小数点値の地域化</title>
317 <programlisting language="php"><![CDATA[
318 $locale = new Zend_Locale('de_AT');
319 $number = Zend_Locale_Format::toFloat(13547.3655,
320 array('precision' => 1,
331 <sect2 id="zend.locale.float.test">
333 <title>浮動小数点値かどうかの確認</title>
336 <methodname>isFloat($value, array $options = array())</methodname> は、
337 指定した文字列が浮動小数点値であるかどうかを
338 <constant>TRUE</constant> あるいは <constant>FALSE</constant> で返します。
341 <example id="zend.locale.float.test.example-1">
342 <title>浮動小数点値かどうかの確認</title>
343 <programlisting language="php"><![CDATA[
344 $locale = new Zend_Locale('de_AT');
345 if (Zend_Locale_Format::isFloat('13.445,36', array('locale' => $locale)) {
348 print "float ではありません";
355 <sect2 id="zend.locale.integer.normalize">
357 <title>整数値の正規化</title>
360 整数値のパースには <methodname>getInteger()</methodname>
361 関数を使用します。これは、整数値を返します。
364 <example id="zend.locale.integer.normalize.example-1">
365 <title>整数値の正規化</title>
366 <programlisting language="php"><![CDATA[
367 $locale = new Zend_Locale('de_AT');
368 $number = Zend_Locale_Format::getInteger('13.524,678',
369 array('locale' => $locale));
378 <sect2 id="zend.locale.integer.localize">
380 <title>整数値の地域化</title>
383 <methodname>toInteger($value, array $options = array())</methodname> は、整数値の地域化を行います。
384 この関数は、指定した数値を地域化した文字列を返します。
387 <example id="zend.locale.integer.localize.example-1">
388 <title>整数値の地域化</title>
389 <programlisting language="php"><![CDATA[
390 $locale = new Zend_Locale('de_AT');
391 $number = Zend_Locale_Format::toInteger(13547.3655,
392 array('locale' => $locale));
401 <sect2 id="zend.locale.integer.test">
403 <title>整数値かどうかの確認</title>
406 <methodname>isInteger($value, array $options = array())</methodname> は、
408 <constant>TRUE</constant> あるいは <constant>FALSE</constant> で返します。
411 <example id="zend.locale.integer.test.example-1">
412 <title>整数値かどうかの確認</title>
413 <programlisting language="php"><![CDATA[
414 $locale = new Zend_Locale('de_AT');
415 if (Zend_Locale_Format::isInteger('13.445', array('locale' => $locale)) {
418 print "integer ではありません";
425 <sect2 id="zend.locale.numbersystems">
427 <title>数値系の変換</title>
430 <methodname>Zend_Locale_Format::convertNumerals()</methodname> は、
432 <ulink url="http://en.wikipedia.org/wiki/Arabic_numerals">数値系</ulink>
433 の間での数値の変換を行います。その中には、標準のアラビア数字
434 (0,1,2,3,4,5,6,7,8,9) も含まれます。これは、
435 <ulink url="http://en.wikipedia.org/wiki/Eastern_Arabic_numerals">東アラビア数字</ulink>
437 東アラビア数字は、アラビア語で数字を表す際に用いられることがあります。
438 サポートしていない数値系を使用すると、例外が発生します。
439 これは、不正確な変換によってエラーが発生するのを防ぐためです。
440 指定された数値系で数値として扱われない文字は、
441 そのまま出力に渡されます。つまり、単位の区切り文字などは変換されないということです。
442 <classname>Zend_Locale*</classname> コンポーネントは、<acronym>CLDR</acronym> が提供するデータに依存しています
443 (<ulink url="http://unicode.org/cldr/data/diff/supplemental/languages_and_scripts.html?sortby=date">
444 言語ごとの文字の一覧</ulink> を参照ください)。
448 <acronym>CLDR</acronym> では今後、Europena/Latin 数値のことを "Latin"
449 と呼ぶようになります。4 文字に略した形式は "Latn" です。
450 また、<acronym>CLDR</acronym> ではこの数値系のことを "scripts" と呼ぶようになります。
454 あるウェブフォームから、東アラビア文字 "١٠٠"
456 大半のソフトウェアや <acronym>PHP</acronym> の関数は、アラビア数字にしか対応していません。
457 幸いなことに、この入力をそれと同等のラテン数字 "100"
458 に変換するのは簡単で、<methodname>convertNumerals($inputNumeralString,
459 $sourceNumeralSystem, $destNumeralSystem)</methodname> を使用するだけです。
460 これは、数値 <code>$input</code> の script を
461 <code>$sourceNumeralSystem</code> から <code>$destNumeralSystem</code>
465 <example id="zend.locale.numbersystems.example-1">
466 <title>東アラビア文字から European/Latin 文字への変換</title>
467 <programlisting language="php"><![CDATA[
468 $arabicScript = "١٠٠"; // アラビア文字で "100" を表します
469 $latinScript = Zend_Locale_Format::convertNumerals($arabicScript,
473 print "\n元の内容: " . $arabicScript;
474 print "\n正規化したもの: " . $latinScript;
479 同様にして、任意の数値系をその他サポートしている数値系に変換できます。
482 <example id="zend.locale.numbersystems.example-2">
483 <title>ラテン文字から東アラビア文字への変換</title>
484 <programlisting language="php"><![CDATA[
485 $latinScript = '123';
486 $arabicScript = Zend_Locale_Format::convertNumerals($latinScript,
490 print "\n元の内容: ".$latinScript;
491 print "\n地域化したもの: " . $arabicScript;
495 <example id="zend.locale.numbersystems.example-3">
496 <title>各国語での文字名を使用した、4 文字の <acronym>CLDR</acronym> 文字コードの取得</title>
497 <programlisting language="php"><![CDATA[
498 function getScriptCode($scriptName, $locale)
500 $scripts2names = Zend_Locale_Data::getList($locale, 'script');
501 $names2scripts = array_flip($scripts2names);
502 return $names2scripts[$scriptName];
504 echo getScriptCode('Latin', 'en'); // 出力は "Latn" となります
505 echo getScriptCode('Tamil', 'en'); // 出力は "Taml" となります
506 echo getScriptCode('tamoul', 'fr'); // 出力は "Taml" となります
512 <methodname>Zend_Locale::getTranslationList('numberingsystem', 'en')</methodname>