Al crear un objeto de medida, los métodos Zend_Measure_* esperan el
valor del dato de medida de entrada/original como primer parámetro. Esto puede ser un
argumento numérico, una
String sin unidades, o una
cadena localizada con unidad(es)
especificada(s). El segundo parámetro define el tipo de medida. Ambos
parámetros son obligatorios. El idioma puede especificarse opcionalmente como tercer parámetro.
Además de valores de datos enteros, se pueden usar tipos de punto flotante, pero "simple decimal fractions like 0.1 or 0.7 cannot be converted into their internal binary counterparts without a little loss of precision," a veces dando resultados sorprendentes. Además, no compare dos números de tipo "float" por igualdad.
Ejemplo 47.3. Creación usando valores enteros y de punto flotante
$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)
Muchas medidas recibidas como entrada en aplicaciones de Zend Framework solo pueden pasarse
a las clases Zend_Measure_* como cadenas, como números escritos
usando números romanos
o valores binarios extremadamente grandes que exceden la precisión de los tipos nativos
enteros y de punto flotante de PHP. Dado que los enteros pueden expresarse
mediante cadenas, si existe algún riesgo de pérdida de precisión debido a las limitaciones de los tipos
nativos enteros y de punto flotante de PHP, use cadenas en su lugar.
Zend_Measure_Number utiliza la extensión BCMath para admitir
precisión arbitraria, como se muestra en el ejemplo siguiente, para evitar limitaciones en muchas
funciones de PHP, como bin2dec().
Ejemplo 47.4. Creación usando cadenas
$mystring = "10010100111010111010100001011011101010001"; $unit = new Zend_Measure_Number($mystring, Zend_Measure_Number::BINARY); echo $unit;
Cuando se ingresa una cadena en una notación localizada, la interpretación correcta no puede
determinarse sin conocer el idioma o región previstos. La división de dígitos decimales con "."
y la agrupación de miles con "," es común en el idioma inglés, pero no en
otros idiomas. Por ejemplo, el número en inglés "1,234.50" se interpretaría como
"1.2345" en alemán. Para lidiar con estos problemas, la familia de clases
Zend_Measure_*, sensible al idioma, ofrece la posibilidad de especificar
un idioma o región para desambiguar los datos de entrada e interpretar correctamente el
valor semántico previsto.
Ejemplo 47.5. Cadena localizada
$locale = new Zend_Locale('de');
$mystring = "1,234.50";
$unit = new Zend_Measure_Length($mystring,
Zend_Measure_Length::STANDARD,
$locale);
echo $unit; // outputs "1.234 m"
$mystring = "1,234.50";
$unit = new Zend_Measure_Length($mystring,
Zend_Measure_Length::STANDARD,
'en_US');
echo $unit; // outputs "1234.50 m"
Desde Zend Framework 1.7.0 Zend_Measure también admite el
uso de un idioma a nivel de aplicación. Simplemente puede establecer una
instancia de Zend_Locale en el registro como se muestra a continuación. Con esta
notación puede olvidarse de establecer el idioma manualmente en cada instancia cuando
desee usar el mismo idioma varias veces.
// in your bootstrap file
$locale = new Zend_Locale('de_AT');
Zend_Registry::set('Zend_Locale', $locale);
// somewhere in your application
$length = new Zend_Measure_Length(Zend_Measure_Length::METER();