When creating a measurement object, Zend_Measure_*
methods expect the input/original measurement
data value as the first parameter. This can be a
numeric argument
, a
string
without units, or a
localized string
with unit(s) specified.
The second parameter defines the type of the measurement. Both parameters are mandatory. The language may
optionally be specified as the third parameter.
In addition to integer data values, floating point types may be used, but "simple decimal fractions like 0.1 or 0.7 cannot be converted into their internal binary counterparts without a little loss of precision," sometimes giving surprising results. Also, do not compare two "float" type numbers for equality.
例 21.3. Creation using integer and floating values
<?php require_once 'Zend/Measure/Length.php'; $measurement = 1234.7; $unit = new Zend_Measure_Length((integer)$measurement, Zend_Measure_Length::STANDARD); echo $unit; // outputs '1234 m' (meters) $unit = new Zend_Measure_Length($measurement, Zend_Measure_Length::STANDARD); echo $unit; // outputs '1234.7 m' (meters) ?>
Many measurements received as input to ZF applications can only be passed to Zend_Measure_*
classes as strings, such as numbers written using
roman numerals
or extremely large binary values that exceed the precision of PHP's native integer and float types. Since
integers can be denoted using strings, if there is any risk of losing precision due to limitations of PHP's
native integer and float types, using strings instead. Zend_Measure_Number
uses the BCMath
extension to support arbitrary precision, as shown in the example below, to avoid limitations in many PHP
functions, such as
bin2dec()
.
例 21.4. Creation using strings
<?php require_once 'Zend/Measure/Number.php'; $mystring = "10010100111010111010100001011011101010001"; $unit = new Zend_Measure_Number($mystring, Zend_Measure_Number::BINARY); echo $unit; ?>
Usually, Zend_Measure_*
can automatically extract the desired measurement embedded in an
arbitrary string. Only the first identifiable number denoted using standard European/Latin digits
(0,1,2,3,4,5,6,7,8,9) will be used for measurement creation. If there are more numerals later in the string,
the rest of these numerals will be ignored.
例 21.5. Arbitrary text input containing measurements
<?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; // outputs "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; // outputs "125 m² in size"; ?>
When a string is entered in a localized notation, the correct interpretation can not be determined without
knowing the intended locale. The division of decimal digits with "." and grouping of thousands with "," is
common in the English language, but not so in other languages. For example, the English number "1,234.50"
would be interpreted as meaning "1.2345" in German. To deal with such problems, the locale-aware
Zend_Measure_*
family of classes offer the possibility to specify a language or region to
disambiguate the input data and properly interpret the intended semantic value.
例 21.6. Localized string
<?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; // outputs "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; // outputs "1234.50 m" ?>