TigerZF
🌐Español

43.3. Normalización y localización

Zend_Locale_Format es un componente interno usado por Zend_Locale. Todas las clases sensibles a la configuración regional usan Zend_Locale_Format para la normalización y localización de números y fechas. La normalización implica analizar la entrada desde una variedad de representaciones de datos, como fechas, en una representación estructurada y estandarizada, como un array de PHP con elementos de año, mes y día.

La misma cadena que contiene un número o una fecha puede significar cosas diferentes para personas con diferentes costumbres y convenciones. La desambiguación de números y fechas requiere reglas sobre cómo interpretar estas cadenas y normalizar los valores en una estructura de datos estandarizada. Por lo tanto, todos los métodos en Zend_Locale_Format requieren una configuración regional para poder analizar los datos de entrada.

[Note] Configuración regional "root" por defecto

Si no se especifica ninguna configuración regional, la normalización y localización usarán la configuración regional estándar "root", lo que podría producir un comportamiento inesperado si la entrada se originó en una configuración regional diferente, o si se esperaba una salida para una configuración regional específica.

43.3.1. Normalización de números: getNumber($input, Array $options)

Existen muchos sistemas numéricos diferentes del sistema decimal común (p. ej. "3.14"). Los números pueden normalizarse con la función getNumber() para obtener la representación decimal estándar. Para todas las discusiones relacionadas con números en este manual, se asumen los numerales arábigos/europeos (0,1,2,3,4,5,6,7,8,9), salvo que se indique explícitamente lo contrario. El array de opciones puede contener un 'locale' para definir los caracteres de agrupación y decimal. El array también puede tener una 'precision' para truncar los dígitos excedentes del resultado.

Ejemplo 43.28. Normalización de números

$locale = new Zend_Locale('de_AT');
$number = Zend_Locale_Format::getNumber('13.524,678',
                                        array('locale' => $locale,
                                              'precision' => 3)
                                       );

print $number; // will return 13524.678

43.3.1.1. Precisión y cálculos

Dado que getNumber($value, array $options = array()) puede normalizar números extremadamente grandes, verifique el resultado cuidadosamente antes de usar cálculos de precisión finita, como las operaciones matemáticas ordinarias de PHP. Por ejemplo, if ((string)int_val($number) != $number) { use BCMath o GMP. La mayoría de las instalaciones de PHP soportan la extensión BCMath.

Además, la precisión de la representación decimal resultante puede redondearse a la longitud deseada con getNumber() usando la opción 'precision'. Si no se proporciona precisión, no se produce ningún redondeo. Use solo enteros de PHP para especificar la precisión.

Si la representación decimal resultante debe truncarse a una longitud deseada en lugar de redondearse, puede usarse la opción 'number_format' en su lugar. Defina la longitud de la representación decimal con la longitud deseada de ceros. El resultado entonces no se redondeará. Así que si la precisión definida dentro de number_format es cero, el valor "1.6" devolverá "1", no "2". Vea el ejemplo a continuación:

Ejemplo 43.29. Normalización de números con precisión

$locale = new Zend_Locale('de_AT');
$number = Zend_Locale_Format::getNumber('13.524,678',
                                        array('precision' => 1,
                                              'locale' => $locale)
                                       );
print $number; // will return 13524.7

$number = Zend_Locale_Format::getNumber('13.524,678',
                                        array('number_format' => '#.00',
                                              'locale' => $locale)
                                       );
print $number; // will return 13524.67

43.3.2. Localización de números

toNumber($value, array $options = array()) puede localizar números a las siguientes configuraciones regionales soportadas. Esta función devolverá una cadena localizada del número dado en un formato convencional para una configuración regional específica. La opción 'number_format' especifica explícitamente un formato de número no predeterminado para usar con toNumber().

Ejemplo 43.30. Localización de números

$locale = new Zend_Locale('de_AT');
$number = Zend_Locale_Format::toNumber(13547.36,
                                       array('locale' => $locale));

// will return 13.547,36
print $number;

[Note] Longitud ilimitada

toNumber() puede localizar números de longitud ilimitada. No está relacionado con limitaciones de enteros o de coma flotante.

De la misma manera que dentro de getNumber(), toNumber() maneja la precisión. Si no se proporciona precisión, se devolverá el número localizado completo.

Ejemplo 43.31. Localización de números con precisión

$locale = new Zend_Locale('de_AT');
$number = Zend_Locale_Format::toNumber(13547.3678,
                                       array('precision' => 2,
                                             'locale' => $locale));

// will return 13.547,37
print $number;

Usando la opción 'number_format' se puede definir un formato autodefinido para generar un número. El formato en sí debe darse en formato CLDR como se describe a continuación. La configuración regional se usa para obtener la separación, precisión y otros signos de formato numérico. Alemán, por ejemplo, define ',' como separador de precisión, mientras que en inglés se usa el signo '.'.

Tabla 43.4. Tokens de formato para formatos de número autogenerados

Token Descripción Formato de ejemplo Salida generada
#0 Genera un número sin precisión ni separación #0 1234567
, Genera una separación con la longitud desde una separación hasta la siguiente separación o hasta 0 #,##0 1,234,567
#,##,##0 Genera una separación estándar de 3 y todas las separaciones siguientes con 2 #,##,##0 12,34,567
. Genera una precisión #0.# 1234567.1234
0 Genera una precisión con una longitud definida #0.00 1234567.12

Ejemplo 43.32. Uso de un formato de número autodefinido

$locale = new Zend_Locale('de_AT');
$number = Zend_Locale_Format::toNumber(13547.3678,
                                       array('number_format' => '#,#0.00',
                                             'locale' => 'de')
                                      );

// will return 1.35.47,36
print $number;

$number = Zend_Locale_Format::toNumber(13547.3,
                                       array('number_format' => '#,##0.00',
                                             'locale' => 'de')
                                       );

// will return 13.547,30
print $number;

43.3.3. Prueba de números

isNumber($value, array $options = array()) comprueba si una cadena dada es un número y devuelve TRUE o FALSE.

Ejemplo 43.33. Prueba de números

$locale = new Zend_Locale();
if (Zend_Locale_Format::isNumber('13.445,36', array('locale' => 'de_AT'))) {
    print "Number";
} else {
    print "not a Number";
}

43.3.4. Normalización de valores de coma flotante

Los valores de coma flotante pueden analizarse con la función getFloat($value, array $options = array()). Se devolverá un valor de coma flotante.

Ejemplo 43.34. Normalización de valores de coma flotante

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

// will return 13524.68
print $number;

43.3.5. Localización de valores de coma flotante

toFloat() puede localizar valores de coma flotante. Esta función devolverá una cadena localizada del número dado.

Ejemplo 43.35. Localización de valores de coma flotante

$locale = new Zend_Locale('de_AT');
$number = Zend_Locale_Format::toFloat(13547.3655,
                                      array('precision' => 1,
                                            'locale' => $locale)
                                     );

// will return 13.547,4
print $number;

43.3.6. Prueba de valores de coma flotante

isFloat($value, array $options = array()) comprueba si una cadena dada es un valor de coma flotante y devuelve TRUE o FALSE.

Ejemplo 43.36. Prueba de valores de coma flotante

$locale = new Zend_Locale('de_AT');
if (Zend_Locale_Format::isFloat('13.445,36', array('locale' => $locale))) {
    print "float";
} else {
    print "not a float";
}

43.3.7. Normalización de valores enteros

Los valores enteros pueden analizarse con la función getInteger(). Se devolverá un valor entero.

Ejemplo 43.37. Normalización de valores enteros

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

// will return 13524
print $number;

43.3.8. Localización de valores enteros

toInteger($value, array $options = array()) puede localizar valores enteros. Esta función devolverá una cadena localizada del número dado.

Ejemplo 43.38. Localización de valores enteros

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

// will return 13.547
print $number;

43.3.9. Prueba de valores enteros

isInteger($value, array $options = array()) comprueba si una cadena dada es un valor entero y devuelve TRUE o FALSE.

Ejemplo 43.39. Prueba de valores enteros

$locale = new Zend_Locale('de_AT');
if (Zend_Locale_Format::isInteger('13.445', array('locale' => $locale))) {
    print "integer";
} else {
    print "not an integer";
}

43.3.10. Conversión de sistemas numerales

Zend_Locale_Format::convertNumerals() convierte dígitos entre diferentes sistemas numerales, incluyendo el sistema numeral arábigo/europeo/latino estándar (0,1,2,3,4,5,6,7,8,9), que no debe confundirse con los numerales arábigos orientales usados a veces con el idioma árabe para expresar numerales. Los intentos de usar un sistema numeral no soportado producirán una excepción, para evitar realizar accidentalmente una conversión incorrecta debido a un error de escritura. Todos los caracteres en la entrada que no son numerales para el sistema numeral seleccionado se copian a la salida sin ninguna conversión proporcionada para los caracteres separadores de unidad. Los componentes Zend_Locale* dependen de los datos proporcionados por CLDR (vea su lista de escrituras agrupadas por idioma).

En CLDR y de aquí en adelante, a los numerales europeos/latinos se les llamará "latinos" o por el código asignado de 4 letras "Latn". Además, el CLDR se refiere a estos sistemas numerales como "scripts" (escrituras).

Suponga que un formulario web recopiló una entrada numérica expresada usando dígitos arábigos orientales "١‎٠٠". La mayoría del software y las funciones de PHP esperan una entrada usando numerales arábigos. Afortunadamente, convertir esta entrada a sus numerales latinos equivalentes "100" requiere poco esfuerzo usando convertNumerals($inputNumeralString, $sourceNumeralSystem, $destNumeralSystem), que devuelve $input con los numerales en la escritura $sourceNumeralSystem convertidos a la escritura $destNumeralSystem.

Ejemplo 43.40. Conversión de numerales de escrituras arábigas orientales a escrituras europeas/latinas

$arabicScript = "١‎٠٠";   // Arabic for "100" (one hundred)
$latinScript = Zend_Locale_Format::convertNumerals($arabicScript,
                                                   'Arab',
                                                   'Latn');

print "\nOriginal:   " . $arabicScript;
print "\nNormalized: " . $latinScript;

De manera similar, cualquiera de los sistemas numerales soportados puede convertirse a cualquier otro sistema numeral soportado.

Ejemplo 43.41. Conversión de numerales de escritura latina a escritura arábiga oriental

$latinScript = '123';
$arabicScript = Zend_Locale_Format::convertNumerals($latinScript,
                                                    'Latn',
                                                    'Arab');

print "\nOriginal:  " . $latinScript;
print "\nLocalized: " . $arabicScript;

Ejemplo 43.42. Obtención del código CLDR de 4 letras usando un nombre en el idioma nativo de la escritura

function getScriptCode($scriptName, $locale)
{
    $scripts2names = Zend_Locale_Data::getList($locale, 'script');
    $names2scripts = array_flip($scripts2names);
    return $names2scripts[$scriptName];
}
echo getScriptCode('Latin', 'en'); // outputs "Latn"
echo getScriptCode('Tamil', 'en'); // outputs "Taml"
echo getScriptCode('tamoul', 'fr'); // outputs "Taml"

Para obtener una lista de los sistemas numerales soportados llame a Zend_Locale::getTranslationList('numberingsystem', 'en').