TigerZF
🌐Español

47.2. Creación de medidas

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.

47.2.1. Creación de medidas a partir de enteros y flotantes

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)

47.2.2. Creación de medidas a partir de cadenas

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;

47.2.3. Medidas a partir de cadenas localizadas

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();