計測値の操作

入力のパースと正規化、そしてローカライズされた表記での出力により、 さまざまなロケールのユーザがデータにアクセスできるようになります。 Zend_Measure_* コンポーネントには それ以外にもさまざまなメソッドがあり、 正規化されたデータを操作できます。

変換

おそらく最も重要な機能は、異なる単位の変換でしょう。 単位の変換は、convertTo() メソッドを使用していつでも何度でも行えます。 単位の変換は、同じ型の単位間に限られます。したがって、 たとえば長さの単位を重さの単位に変換することなどはできません。 もしそんなことができたらプログラムがめちゃくちゃになってしまい、 エラーだらけになってしまうでしょう。

convertTo() メソッドには、オプションのパラメータ 'round' を指定できます。 これは、出力結果の精度を設定するものです。標準の精度は '2' です。

例595 変換

$locale = new Zend_Locale('de');
$mystring = "1.234.567,89";
$unit = new Zend_Measure_Weight($mystring,'POND', $locale);

print "Kilo:".$unit->convertTo('KILOGRAM');

// 文字列を使うより定数で指定するほうが "よりよい方法" です
print "Ton:".$unit->convertTo(Zend_Measure_Weight::TON);

// 出力の精度を定義します
print "Ton:".$unit->convertTo(Zend_Measure_Weight::TON, 3);

加減算

複数の計測値の加算には add()、 そして減算には sub() を使用します。 その結果は、もとのオブジェクトと同じ型を使うでしょう。 ダイナミック・オブジェクトは、プログラミングの流体スタイルをサポートします。 そこでは、入力オブジェクトを変更する副作用の危険なしに、 演算の入り組んだ順序を入れ子にできます。

例596 単位の加算

// オブジェクトを定義します
$unit = new Zend_Measure_Length(200, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

// $unit2 を $unit に足します
$sum = $unit->add($unit2);

echo $sum; // "300 cm" と出力します


自動的な変換

あるオブジェクトを別のオブジェクトに足す際には、 適切な単位に自動的に変換されます。異なる単位の値を足す前に convertTo() をコールする必要はありません。

例597 減算

減算も、加算と同じように動作します。

// オブジェクトを定義します
$unit = new Zend_Measure_Length(200, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

// $unit2 を $unit から引きます
$sum = $unit->sub($unit2);

echo $sum;


比較

計測値を比較することもできますが、自動的な単位変換は行われません。 したがって、equals()TRUE を返すのは、値と単位の両方が等しい場合のみです。

例598 異なる計測値

// 値を定義します
$unit = new Zend_Measure_Length(100, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

if ($unit->equals($unit2)) {
    print "これらは同じです";
} else {
    print "これらは異なります";
}


例599 同一の計測値

// 値を定義します
$unit = new Zend_Measure_Length(100, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);

$unit2->setType(Zend_Measure_Length::CENTIMETER);

if ($unit->equals($unit2)) {
    print "これらは同じです";
} else {
    print "これらは異なります";
}


比較

ある計測値が別の計測値より小さいか大きいかを調べるには compare() を使用します。これは、 ふたつのオブジェクトの差によって 0、1 あるいは -1 を返します。 ふたつが同一の場合は 0、小さい場合は負の数、 そして大きい場合は正の数を返します。

例600 差

$unit = new Zend_Measure_Length(100, Zend_Measure_Length::CENTIMETER);
$unit2 = new Zend_Measure_Length(1, Zend_Measure_Length::METER);
$unit3 = new Zend_Measure_Length(1.2, Zend_Measure_Length::METER);

print "Equal:".$unit2->compare($unit);
print "Lesser:".$unit2->compare($unit3);
print "Greater:".$unit3->compare($unit2);


値の変更

値を明示的に変更するには setValue() を使用します。 これは現在の値を上書きします。パラメータは、コンストラクタと同じです。

例601 値の変更

$locale = new Zend_Locale('de_AT');
$unit = new Zend_Measure_Length(1,Zend_Measure_Length::METER);

$unit->setValue(1.2);
echo $unit;

$unit->setValue(1.2, Zend_Measure_Length::KILOMETER);
echo $unit;

$unit->setValue("1.234,56", Zend_Measure_Length::MILLIMETER,$locale);
echo $unit;


型の変更

値はそのままで型だけを変更するには setType() を使用します。

例602 型の変更

$unit = new Zend_Measure_Length(1,Zend_Measure_Length::METER);
echo $unit; // "1 m" と出力します

$unit->setType(Zend_Measure_Length::KILOMETER);
echo $unit; // "1000 km" と出力します