18.4. 計測値の操作
前のページ | 第18章 Zend_Measure | 次のページ

## 18.4. 計測値の操作

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

- `変換`

- `加減算`

- `真偽の比較`

- `大小の比較`

- `値の変更`

- `型の変更`

### 18.4.1. 変換

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

例 18.10. 変換

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

    $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);
    ?>

### 18.4.2. 加減算

複数の計測値の加算には `add()`、そして減算には `sub()` を使用します。これらはそれぞれ、結果を格納した新しいオブジェクトを作成します。 このクラスがもとのオブジェクトを変更することはありません。 新しいオブジェクトは、もとのオブジェクトと同じ型になります。 Dynamic objects support a fluid style of programming, where complex sequences of operations can be nested without risk of side-effects altering the input objects.

例 18.11. 単位の加算

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

    // オブジェクトを定義します
    $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()` をコールする必要はありません。

例 18.12. 減算

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

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

    // オブジェクトを定義します
    $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;
    ?>

### 18.4.3. 比較

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

例 18.13. 異なる計測値

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

    // 値を定義します
    $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 "これらは異なります";
    }
    ?>

例 18.14. 同一の計測値

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

    // 値を定義します
    $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 "これらは異なります";
    }
    ?>

### 18.4.4. 比較

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

例 18.15. 差

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

    $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 "Greater:".$unit2->compare($unit3);
    print "Lesser:".$unit3->compare($unit2);
    ?>

### 18.4.5. 値の変更

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

例 18.16. 値の変更

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

    $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;
    ?>

### 18.4.6. 型の変更

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

例 18.17. 型の変更

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

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

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

前のページ | 上に戻る | 次のページ
18.3. 計測値の出力 | ホーム | 18.5. 特別な関数