計測値を表すオブジェクトを作成する際には、
Zend_Measure_*
のメソッドの最初のパラメータに
入力値あるいは元の値を指定します。これは、
数値の引数
あるいは単位を含まない
文字型
、
あるいは
単位を指定した地域化された文字列
のいずれかとなります。
二番目の引数には、計測値の型を指定します。どちらのパラメータも必須です。
言語は、任意で三番目のパラメータとして指定します。
整数に加えて、浮動小数点数を使用することもできます。しかし、 "0.1 や 0.7 のようなシンプルな小数であっても、 それを内部的な二進数表現に変換する際には、どうしても多少精度が落ちてしまいます。" そのため、予期せぬ結果を引き起こすことがあります。 また、ふたつの "浮動小数点数" が等しいかどうかを調べないようにしましょう。
例589 整数および浮動小数点数を使用しての作成
$measurement = 1234.7; $unit = new Zend_Measure_Length((integer)$measurement, Zend_Measure_Length::STANDARD); echo $unit; // 出力は '1234 m' (メートル) となります $unit = new Zend_Measure_Length($measurement, Zend_Measure_Length::STANDARD); echo $unit; // 出力は '1234.7 m' (メートル) となります
Zend Framework アプリケーションが入力として受け取って Zend_Measure_*
クラスに渡す値の多くは、文字列としてしか渡せません。
たとえば
ローマ数字
の値は、PHP の整数型・浮動小数点型の制限を越える値などがこれにあたります。
整数値は文字列として表すことも可能です。
PHP の数値処理用関数の制限によって値の精度が損なわれる可能性がある場合は、
代わりに文字列を使用するようにしましょう。
Zend_Measure_Number
は、BCMath 拡張モジュールを使用して
任意の精度をサポートしています。以下の例に示すとおり、
bin2dec()
のような多くの PHP 関数の制限を避けるようになっています。
例590 文字列を使用しての作成
$mystring = "10010100111010111010100001011011101010001"; $unit = new Zend_Measure_Number($mystring, Zend_Measure_Number::BINARY); echo $unit;
各国固有の記法で文字列を入力した場合は、
正しいロケールを知らない限りそれを正確に解釈できません。
小数点に "." を用い、三桁ごとの桁区切り文字に ","
を用いるのは英語では一般的です。しかし、その他の言語でもそうだとは限りません。
例えば、英語の "1,234.50" は、ドイツ語では "1.2345" という意味になります。
このような問題に対処するために、ロケールを考慮した
Zend_Measure_*
系のクラスが用意されています。
これは、言語や地域を指定することによって入力内容の曖昧さをなくし、
意図した値として適切に解釈されるようにします。
例591 ローカライズされた文字列
$locale = new Zend_Locale('de'); $mystring = "1,234.50"; $unit = new Zend_Measure_Length($mystring, Zend_Measure_Length::STANDARD, $locale); echo $unit; // 出力は "1.234 m" となります $mystring = "1,234.50"; $unit = new Zend_Measure_Length($mystring, Zend_Measure_Length::STANDARD, 'en_US'); echo $unit; // 出力は "1234.50 m" となります
Zend Framework 1.7.0 以降では、Zend_Measure
はアプリケーション単位でのロケールの使用にも対応します。
そのためには、Zend_Locale
のインスタンスを以下のようにレジストリに登録します。
このようにすれば、同じロケールを何度も使用したいときに
各インスタンスで毎回ロケールを設定する手間を省けます。
// 起動ファイルで $locale = new Zend_Locale('de_AT'); Zend_Registry::set('Zend_Locale', $locale); // アプリケーションのどこかで $length = new Zend_Measure_Length(Zend_Measure_Length::METER();