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.
![]() |
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. |
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
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
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;
![]() |
Longitud ilimitada |
|---|---|
|
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;
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";
}
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;
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;
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";
}
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;
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;
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";
}
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').
![[Note]](images/note.png)