21.2. 計測値の作成

計測値を表すオブジェクトを作成する際には、 Zend_Measure_* のメソッドの最初のパラメータに 入力値あるいは元の値を指定します。これは、 数値の引数 あるいは単位を含まない 文字列 、 あるいは単位を指定した 各国固有の文字列 のいずれかとなります。 二番目の引数には、計測値の型を指定します。どちらのパラメータも必須です。 言語は、任意で三番目のパラメータとして指定します。

21.2.1. 整数および浮動小数点数からの計測値の作成

整数に加えて、浮動小数点数を使用することもできます。しかし、 "0.1 や 0.7 のようなシンプルな小数であっても、 それを内部的な二進数表現に変換する際には、どうしても多少精度が落ちてしまいます。" そのため、予期せぬ結果を引き起こすことがあります。 また、ふたつの "浮動小数点数" が等しいかどうかを調べないようにしましょう。

例 21.3. 整数および浮動小数点数を使用しての作成

<?php
require_once 'Zend/Measure/Length.php';

$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' (メートル) となります
?>

21.2.2. 文字列からの計測値の作成

ZF アプリケーションが入力として受け取って Zend_Measure_* クラスに渡す値の多くは、文字列としてしか渡せません。 たとえば ローマ数字 の値は、PHP の整数型・浮動小数点型の制限を越える値などがこれにあたります。 整数値は文字列として表すことも可能です。 PHP の数値処理用関数の制限によって値の精度が損なわれる可能性がある場合は、 代わりに文字列を使用するようにしましょう。 Zend_Measure_Number は、BCMath 拡張モジュールを使用して 任意の精度をサポートしています。以下の例に示すとおり、 bin2dec() のような多くの PHP 関数の制限を避けるようになっています。

例 21.4. 文字列を使用しての作成

<?php
require_once 'Zend/Measure/Number.php';

$mystring = "10010100111010111010100001011011101010001";
$unit = new Zend_Measure_Number($mystring, Zend_Measure_Number::BINARY);

echo $unit;
?>

通常は、任意の文字列に埋め込まれた計測値を Zend_Measure_* が自動的に抽出します。 標準の European/Latin 数値 (0,1,2,3,4,5,6,7,8,9) として認識可能な値が最初に見つかった時点で、それを用いて値を作成します。 文字列内に数値が複数あった場合は、それ以降のものは無視されます。

例 21.5. 計測値を含む任意の入力テキスト

<?php
require_once 'Zend/Measure/Area.php';

$mystring = "My house is 125m² in size";
$unit = new Zend_Measure_Area($mystring, Zend_Measure_Area::STANDARD);
echo $unit; // 出力は "125 m² in size" となります

$mystring = "My house is 125m² in size, it has 5 rooms of 25m² each.";
$unit = new Zend_Measure_Area($mystring, Zend_Measure_Area::STANDARD);
echo $unit; // 出力は "125 m² in size" となります
?>

21.2.3. ローカライズされた文字列をもとにした計測値

各国固有の記法で文字列を入力した場合は、 正しいロケールを知らない限りそれを正確に解釈できません。 小数点に "." を用い、三桁ごとの桁区切り文字に "," を用いるのは英語では一般的です。しかし、その他の言語でもそうだとは限りません。 例えば、英語の "1,234.50" は、ドイツ語では "1.2345" という意味になります。 このような問題に対処するために、ロケールを考慮した Zend_Measure_* 系のクラスが用意されています。 これは、言語や地域を指定することによって入力内容の曖昧さをなくし、 意図した値として適切に解釈されるようにします。

例 21.6. ローカライズされた文字列

<?php
require_once 'Zend/Measure/Length.php';

$locale = new Zend_Locale('de');
$mystring = "The boat is 1,234.50 long.";
$unit = new Zend_Measure_Length($mystring, Zend_Measure_Length::STANDARD, $locale);
echo $unit; // 出力は "1.234 m" となります


$mystring = "The boat is 1,234.50 long.";
$unit = new Zend_Measure_Length($mystring, Zend_Measure_Length::STANDARD, 'en_US');
echo $unit; // 出力は "1234.50 m" となります
?>