15.3. 正規化および地域化
前のページ | 第15章 Zend_Locale | 次のページ

## 15.3. 正規化および地域化

`Zend_Locale_Format` は、Zend_Locale が内部で使用しているコンポーネントです。 ロケール対応のクラスは、`Zend_Locale_Format` を用いて数値や日付の正規化および地域化を行います。 正規化とは、さまざまな形式で表されるデータ (日付など) を取り込んで解析し、 標準化された構造化表現 (year、month、day の各要素からなる配列など) に変換することです。

まったく同じ文字列からなる数値や日付でも、 異なる習慣や規約を使用している人が見ると異なる意味にとられることがあります。 数値や日付を、あいまいさをなくして正確に解釈するには、 これらの文字列を正規化し、標準化されたデータ構造に変換する必要があります。 したがって、`Zend_Locale_Format` のすべてのメソッドは、 入力データを処理するためにロケール情報を必要とします。

| デフォルトの "root" ロケール
ロケールを省略した場合は、正規化や地域化の際に 標準の "root" ロケールを使用します。 これは予期せぬ動作を引き起こす可能性があります。 さまざまなロケールの入力を扱ったり、特定のロケールで出力したい場合などに注意が必要です。

### 15.3.1. 数値の正規化: getNumber($input, $precision = false, $locale = false)

標準の 十進形式 (例: "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 を返します
    ?>

#### 15.3.1.1. 計算の精度

`getNumber()` では、非常に大きな数値も正規化できるので、 PHP の通常の数値計算のように精度が限られている計算をする前には注意しましょう。 たとえば `if ((string)int_val($number) != $number) { BCMath あるいは GMP を使用するなど。` 実際にインストールされている PHP のほとんどは、 BCMath 拡張モジュールをサポートしています。

また、結果の十進表現の精度も、 `getNumber()` で指定した長さに切り詰められます。 精度を指定しなかった場合は、切り詰められることはありません。 精度を指定するには、PHP の整数のみを使用します。 結果の丸めは行われません。つまり、もし精度がゼロなら、 "1.6" は "1" であり、"2" とはなりません。

例 15.16. 精度を指定した数値の正規化

    <?php
    require_once 'Zend/Locale.php';

    $locale = new Zend_Locale('de_AT');
    $number = Zend_Locale_Format::getNumber('13.524,678', 1, $locale);

    print $number; // 13524.6 を返します
    ?>

### 15.3.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;
    ?>

| 長さは無制限
`toNumber()` が地域化できる数値の長さには制限がありません。 整数や浮動小数点数の範囲の制限を受けることはありません。

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

| 注意
`toNumber()` は結果を切り詰めます。 結果の丸めは行われません。つまり、1.6 は 2 ではなく 1 となります。

### 15.3.3. 数値かどうかの確認

`isNumber()` は、指定した文字列が数値であるかどうかを true あるいは false で返します。

例 15.19. 数値かどうかの確認

    <?php
    require_once 'Zend/Locale.php';

    $locale = new Zend_Locale();
    if (Zend_Locale_Format::isNumber('13.445,36', 'de_AT') {
        print "数値です";
    } else {
        print "数値ではありません";
    }
    ?>

### 15.3.4. 浮動小数点値の正規化

浮動小数点値のパースには `getFloat()` 関数を使用します。これは、浮動小数点値を返します。

例 15.20. 浮動小数点値の正規化

    <?php
    require_once 'Zend/Locale.php';

    $locale = new Zend_Locale('de_AT');
    $number = Zend_Locale_Format::getFloat('13.524,678', 2, $locale);

    // 13524.67 を返します
    print $number;
    ?>

### 15.3.5. 浮動小数点値の地域化

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

| 注意
`toFloat()` は結果を切り詰めます。 結果の丸めは行われません。つまり、1.6 は 2 ではなく 1 となります。

### 15.3.6. 浮動小数点値かどうかの確認

`isFloat()` は、指定した文字列が浮動小数点値であるかどうかを true あるいは false で返します。

例 15.22. 浮動小数点値かどうかの確認

    <?php
    require_once 'Zend/Locale.php';

    $locale = new Zend_Locale('de_AT');
    if (Zend_Locale_Format::isFloat('13.445,36', $locale) {
        print "float です";
    } else {
        print "float ではありません";
    }
    ?>

### 15.3.7. 整数値の正規化

整数値のパースには `getInteger()` 関数を使用します。これは、整数値を返します。

例 15.23. 整数値の正規化

    <?php
    require_once 'Zend/Locale.php';

    $locale = new Zend_Locale('de_AT');
    $number = Zend_Locale_Format::getInteger('13.524,678', $locale);

    // 13524 を返します
    print $number;
    ?>

### 15.3.8. 整数値の地域化

`toInteger()` は、整数値の地域化を行います。 この関数は、指定した数値を地域化した文字列を返します。

例 15.24. 整数値の地域化

    <?php
    require_once 'Zend/Locale.php';

    $locale = new Zend_Locale('de_AT');
    $number = Zend_Locale_Format::toInteger(13547.3655, $locale);

    // 13.547 を返します
    print $number;
    ?>

### 15.3.9. 整数値かどうかの確認

`isInteger()` は、指定した文字列が整数値であるかどうかを true あるいは false で返します。

例 15.25. 整数値かどうかの確認

    <?php
    require_once 'Zend/Locale.php';

    $locale = new Zend_Locale('de_AT');
    if (Zend_Locale_Format::isInteger('13.445', $locale) {
        print "integer です";
    } else {
        print "integer ではありません";
    }
    ?>

### 15.3.10. 数値系の変換

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

同様にして、任意の数値系をその他サポートしている数値系に変換できます。

例 15.27. European/Latin からアラビア文字への変換

    <?php
    require_once 'Zend/Locale.php';

    $string = '123';
    $local = Zend_Locale_Format::convertNumerals($string, 'Default', 'Arab');

    print "\n元の内容: ".$string;
    print "\n地域化したもの:".$local;
    ?>

#### 15.3.10.1. サポートしている数値系の一覧

表 15.1. サポートしている数値系の一覧

記法名 | 文字
--- | ---
アラビア文字 | Arab
バリ文字 | Bali
ベンガル文字 | Beng
デーバナーガリー文字 | Deva
グジャラート文字 | Gujr
グルムキー文字 | Guru
カンナダ文字 | Knda
カンボジア文字 | Khmr
ラオ文字 | Laoo
リンブ文字 | Limb
マラヤーラム文字 | Mlym
モンゴル文字 | Mong
ミャンマー文字 | Mymr
タイレ文字 | Talu
N'Ko | Nkoo
オリヤー文字 | Orya
タミール文字 | Taml
テルグ文字 | Telu
タイ文字 | Tale
チベット文字 | Tibt

前のページ | 上に戻る | 次のページ
15.2. Zend_Locale の使用法 | ホーム | 15.4. 日付および時刻の扱い