1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20827 -->
4 <sect1 id="zend.measure.creation">
10 <classname>Zend_Measure_*</classname> のメソッドの最初のパラメータに
12 <link linkend="zend.measure.creation.number"><code>数値の引数</code>
15 <link linkend="zend.measure.creation.string"><code>文字列</code>
18 <link linkend="zend.measure.creation.localized"><code>各国固有の文字列</code>
21 二番目の引数には、計測値の型を指定します。どちらのパラメータも必須です。
22 言語は、任意で三番目のパラメータとして指定します。
25 <sect2 id="zend.measure.creation.number">
27 <title>整数および浮動小数点数からの計測値の作成</title>
30 整数に加えて、浮動小数点数を使用することもできます。しかし、
31 <ulink url="http://www.php.net/float">"0.1 や 0.7 のようなシンプルな小数であっても、
32 それを内部的な二進数表現に変換する際には、どうしても多少精度が落ちてしまいます。"</ulink>
33 そのため、予期せぬ結果を引き起こすことがあります。
34 また、ふたつの "浮動小数点数" が等しいかどうかを調べないようにしましょう。
37 <example id="zend.measure.creation.number.example-1">
38 <title>整数および浮動小数点数を使用しての作成</title>
39 <programlisting language="php"><![CDATA[
40 $measurement = 1234.7;
41 $unit = new Zend_Measure_Length((integer)$measurement,
42 Zend_Measure_Length::STANDARD);
44 // 出力は '1234 m' (メートル) となります
46 $unit = new Zend_Measure_Length($measurement, Zend_Measure_Length::STANDARD);
48 // 出力は '1234.7 m' (メートル) となります
54 <sect2 id="zend.measure.creation.string">
56 <title>文字列からの計測値の作成</title>
59 Zend Framework アプリケーションが入力として受け取って <classname>Zend_Measure_*</classname>
60 クラスに渡す値の多くは、文字列としてしか渡せません。
62 <ulink url="http://en.wikipedia.org/wiki/Roman_numerals">ローマ数字</ulink>
63 の値は、<acronym>PHP</acronym> の整数型・浮動小数点型の制限を越える値などがこれにあたります。
65 <acronym>PHP</acronym> の数値処理用関数の制限によって値の精度が損なわれる可能性がある場合は、
67 <classname>Zend_Measure_Number</classname> は、BCMath 拡張モジュールを使用して
68 任意の精度をサポートしています。以下の例に示すとおり、
69 <ulink url="http://php.net/bin2dec"><methodname>bin2dec()</methodname>
71 のような多くの <acronym>PHP</acronym> 関数の制限を避けるようになっています。
74 <example id="zend.measure.creation.string.example-1">
75 <title>文字列を使用しての作成</title>
76 <programlisting language="php"><![CDATA[
77 $mystring = "10010100111010111010100001011011101010001";
78 $unit = new Zend_Measure_Number($mystring, Zend_Measure_Number::BINARY);
86 <sect2 id="zend.measure.creation.localized">
88 <title>ローカライズされた文字列をもとにした計測値</title>
92 正しいロケールを知らない限りそれを正確に解釈できません。
93 小数点に "." を用い、三桁ごとの桁区切り文字に ","
94 を用いるのは英語では一般的です。しかし、その他の言語でもそうだとは限りません。
95 例えば、英語の "1,234.50" は、ドイツ語では "1.2345" という意味になります。
96 このような問題に対処するために、ロケールを考慮した
97 <classname>Zend_Measure_*</classname> 系のクラスが用意されています。
98 これは、言語や地域を指定することによって入力内容の曖昧さをなくし、
99 意図した値として適切に解釈されるようにします。
102 <example id="zend.measure.creation.localized.example-1">
103 <title>ローカライズされた文字列</title>
104 <programlisting language="php"><![CDATA[
105 $locale = new Zend_Locale('de');
106 $mystring = "1,234.50";
107 $unit = new Zend_Measure_Length($mystring,
108 Zend_Measure_Length::STANDARD,
110 echo $unit; // 出力は "1.234 m" となります
112 $mystring = "1,234.50";
113 $unit = new Zend_Measure_Length($mystring,
114 Zend_Measure_Length::STANDARD,
116 echo $unit; // 出力は "1234.50 m" となります
121 Zend Framework 1.7.0 以降では、<classname>Zend_Measure</classname>
122 はアプリケーション単位でのロケールの使用にも対応します。
123 そのためには、<classname>Zend_Locale</classname>
124 のインスタンスを以下のようにレジストリに登録します。
125 このようにすれば、同じロケールを何度も使用したいときに
126 各インスタンスで毎回ロケールを設定する手間を省けます。
129 <programlisting language="php"><![CDATA[
131 $locale = new Zend_Locale('de_AT');
132 Zend_Registry::set('Zend_Locale', $locale);
135 $length = new Zend_Measure_Length(Zend_Measure_Length::METER();