Zend_Locale_Format
は、Zend_Locale が内部で使用しているコンポーネントです。
ロケール対応のクラスは、Zend_Locale_Format
を用いて数値や日付の正規化および地域化を行います。
正規化とは、さまざまな形式で表されるデータ (日付など) を取り込んで解析し、
標準化された構造化表現 (year、month、day の各要素からなる配列など) に変換することです。
まったく同じ文字列からなる数値や日付でも、
異なる習慣や規約を使用している人が見ると異なる意味にとられることがあります。
数値や日付を、あいまいさをなくして正確に解釈するには、
これらの文字列を正規化し、標準化されたデータ構造に変換する必要があります。
したがって、Zend_Locale_Format
のすべてのメソッドは、
入力データを処理するためにロケール情報を必要とします。
![]() |
デフォルトの "root" ロケール |
---|---|
ロケールを省略した場合は、正規化や地域化の際に 標準の "root" ロケールを使用します。 これは予期せぬ動作を引き起こす可能性があります。 さまざまなロケールの入力を扱ったり、特定のロケールで出力したい場合などに注意が必要です。 |
標準の
十進形式
(例: "3.14") とは異なる
数値形式
には、さまざまなものがあります。
数値を正規化するには getNumber()
関数を使用します。これは、標準の十進形式を返します。
このマニュアルにおける数値関連の説明はすべて、特にことわりがない限り
アラビア数字 (0,1,2,3,4,5,6,7,8,9)
を想定したものです。
例 15.15. 数値の正規化
<?php require_once 'Zend/Locale.php'; $locale = new Zend_Locale('de_AT'); $number = Zend_Locale_Format::getNumber('13.524,678', false, $locale); print $number; // 13524.678 を返します ?>
getNumber()
では、非常に大きな数値も正規化できるので、
PHP の通常の数値計算のように精度が限られている計算をする前には注意しましょう。
たとえば if
((string)int_val($number) != $number) {
BCMath
あるいは
GMP
を使用するなど。
実際にインストールされている PHP のほとんどは、
BCMath 拡張モジュールをサポートしています。
また、結果の十進表現の精度も、
getNumber()
で指定した長さに切り詰められます。
精度を指定しなかった場合は、切り詰められることはありません。
精度を指定するには、PHP の整数のみを使用します。
結果の丸めは行われません。つまり、もし精度がゼロなら、
"1.6" は "1" であり、"2" とはなりません。
toNumber()
は、
サポートするロケール
にあわせて数値を正規化します。
この関数は、指定した数値を、特定のロケールにあわせて書式化した文字列を返します。
例 15.17. 数値の地域化
<?php require_once 'Zend/Locale.php'; $locale = new Zend_Locale('de_AT'); $number = Zend_Locale_Format::toNumber(13547.36, $locale); // 13.547,36 を返します print $number; ?>
![]() |
長さは無制限 |
---|---|
|
getNumber()
と同様の方法で、
toNumber()
も精度を扱います。
精度を指定しなかった場合は、地域化した数値を完全な状態で返します。
例 15.18. 精度を指定した数値の地域化
<?php require_once 'Zend/Locale.php'; $locale = new Zend_Locale('de_AT'); $number = Zend_Locale_Format::toNumber(13547.3678, 2, $locale); // 13.547,36 を返します print $number; ?>
![]() |
注意 |
---|---|
|
isNumber()
は、指定した文字列が数値であるかどうかを
true あるいは false で返します。
浮動小数点値のパースには getFloat()
関数を使用します。これは、浮動小数点値を返します。
toFloat()
は、浮動小数点値の地域化を行います。
この関数は、指定した数値を地域化した文字列を返します。
例 15.21. 浮動小数点値の地域化
<?php require_once 'Zend/Locale.php'; $locale = new Zend_Locale('de_AT'); $number = Zend_Locale_Format::toFloat(13547.3655, 1, $locale); // 13.547,3 を返します print $number; ?>
![]() |
注意 |
---|---|
|
isFloat()
は、指定した文字列が浮動小数点値であるかどうかを
true あるいは false で返します。
整数値のパースには getInteger()
関数を使用します。これは、整数値を返します。
toInteger()
は、整数値の地域化を行います。
この関数は、指定した数値を地域化した文字列を返します。
isInteger()
は、指定した文字列が整数値であるかどうかを
true あるいは false で返します。
Zend_Locale_Format::convertNumerals()
は、
さまざまな
数値系
の間での数値の変換を行います。その中には、標準のアラビア数字
(0,1,2,3,4,5,6,7,8,9) も含まれます。これは、
東アラビア数字
とは異なることに注意しましょう。
東アラビア数字は、アラビア語で数字を表す際に用いられることがあります。
サポートしていない数値系を使用すると、例外が発生します。
これは、不正確な変換によってエラーが発生するのを防ぐためです。
指定された数値系で数値として扱われない文字は、
そのまま出力に渡されます。つまり、単位の区切り文字などは変換されないということです。
あるウェブフォームから、アラビア文字 "١٠٠"
が入力されたとしましょう。
大半のソフトウェアや PHP の関数は、アラビア数字にしか対応していません。
幸いなことに、この入力をそれと同等のアラビア数字 "100"
に変換するのは簡単で、convertNumerals($inputNumeralString,
$sourceNumeralSystem, $destNumeralSystem)
を使用するだけです。
これは、数値 $input
を
$sourceNumeralSystem
から $destNumeralSystem
に変換したものを返します。
例 15.26. アラビア文字から European/Latin への変換
<?php require_once 'Zend/Locale.php'; $string = "١٠٠"; // アラビア文字で 100 を表します $normal = Zend_Locale_Format::convertNumerals($string, 'Arab', 'Default'); print "\n元の内容: ".$string; print "\n正規化したもの:".$normal; ?>
同様にして、任意の数値系をその他サポートしている数値系に変換できます。