Programación en castellano
Inicio > Tutoriales > Lenguajes orientados a objeto > J2SE > Internacionalización de Programas Java
-Tutoriales

Internacionalización de Programas Java


Formateo de Números y Monedas

Los programas almacenan y operan con números de una forma independiente de la Localidad. Antes de mostrar o imprimir un número el programa debe convertirlo a un String que esté en un formato sensible a la Localidad. Por ejemplo, en Francia, el número 123456.78 debería ser formateado como 123 456,78, y en Alemania debería aparecer como 123.456,78. En esta lección, aprenderás como hacer que tus programas sean idependientes de las convenciones de la localidad para los puntos decimales, los separadores de millares, y otras propiedades de formateo.

. Utilizar Formatos Predefinidos

Utilizando los métodos de factoría proporcionados por la clase NumberFormat, se pueden obtener formatos específicos de la localidad para números, monedas y porcentajes.

Llamando a los métodos de la clase NumberFormat se pueden formatear números, monedas y porcentajes de acuerdo a la Localidad. Sin embargo, hay un error: NumberFormat podría no soportar la Localidad especificada. Para conocer las definiciones de Locale soportadas por NumberFormat, llamamos al método getAvailableLocales.

Locale[] locales = NumberFormat.getAvailableLocales();

Si NumberFormat no soporta la localidad que necesitamos, podemos crear nuestro propio formateador. Explicaremos este procedimiento en la siguiente sección, Formatear con Patrones.

El siguiente material muestra como obtener formateadores específicos de la localidad para números, monedas y porcentajes. Los códigos de ejemplo son de un programa llamado NumberFormatDemo.java.

. Números

Se pueden utilizar los métodos de factoria de NumberFormat para formatear números de tipos de datos primitivos, como double, y sus correspondientes objetos, como Double.

En el siguiente fragmento de código, formatearemos un Double de acuerdo a la Localidad. Primero, obtendrémos un ejemplar de NumberFormat específico de la Localidad, llamando a getNumberInstance. Luego llamamos al método format con el Double como argumento. El método format devuelve el número formateado en un String, que está listo para ser mostrado.

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + "   " + currentLocale.toString());

La salida de este ejemplo muestra como el formato del mismo número varía con la Localidad.

345 987,246   fr_FR
345.987,246   de_DE
345,987.246   en_US

. Monedas

Si estás escribiendo apliaciones de negocios, necesitarás formatear y mostrar valores en monedas. Las monedas se formatean de la misma forma que los números, excepto en que se llama a getCurrencyInstance para crear el formateador. Cuando se llama al método format , devuelve un String que incluye el número formateado y el signo de moneda apropiado.

El siguiente código muestra como formatear moneda de una forma específica de la Localidad.

Double currency = new Double(9876543.21);
NumberFormat currencyFormatter;
String currencyOut;

currencyFormatter = NumberFormat.getCurrencyInstance(currentLocale);
currencyOut = currencyFormatter.format(currency);
System.out.println(currencyOut + "   " + currentLocale.toString());

La salida genera por las líneas precedentes sería esta.

9 876 543,21 F   fr_FR
9.876.543,21 DM   de_DE
$9,876,543.21   en_US

A primera vista, esta salida podría parecer errónea, porque los valores numéricos son iguales. Por supesto, 9 876 543,21 F no es equivalente a 9.876.543,21 DM. Sin embargo, recuerda que la clase NumberFormat no puede cambiar monedas. Los métodos pertenecientes a la clase NumberFormat formatean monedas, pero no las convierten.

. Porcentajes

Támbien se pueden utilizar los métodos de la clase NumberFormat para formatear porcentajes. Para obtener el formateador específico de la localidad se llama al método getPercentInstance. Con este formateador, un fracción como 0.75 se mostrará como 75%.

El siguiente código muetra como formatear porcentajes.

Double percent = new Double(0.75);
NumberFormat percentFormatter;
String percentOut;

percentFormatter = NumberFormat.getPercentInstance(currentLocale);
percentOut = percentFormatter.format(percent);

. Formatear con Patrones

Con la clase DecimalFormat se específica un formato de número con patrón. La clase DecimalFormatSymbols permite modificar los simbolos de formateo como separadores decimales o el signo negativo.

Se puede utilizar la clase DecimalFormat para formatear números decimales en cadenas específicas de la Localidad. Esta clase permite controlar los ceros iniciales y finales, los sufijos y prefijos, separadores (millares), y el separador decimal. Si se quiere cambiar un símbolo del formateo como el saperador decimal, se puede utilizar DecimalFormatSymbols en conjunción con la clase DecimalFormat. Estas clases ofrecen una gran flexibilidad en el formateo de números, pero hacen el código más complejo. Siempre que sea posible, se debería utilizar la clase NumberFormat, que se describió en la sección anterior, en vez de DecimalFormat y DecimalFormatSymbols.

Utilizando ejemplos, las siguientes líneas mostrarán como utilizar las clases DecimalFormat y DecimalFormatSymbols. Los fragmentos de código se han extraido de un programa llamado DecimalFormatDemo.java.

. Construir Patrones

Las propiedades de formateo de DecimalFormat se específican con un String patrón. El patrón determina la apariencia del número formateado. Para una descripción completa de la síntaxis de los patrones puedes ver Síntaxis de los Patrones de Formateo de Números.

En el siguiente ejemplo, hemos creado un formateador, pasándole un patrón al constructor de DecimalFormat. Luego, le hemos pasado un valor double al método format, que devuelve un String formateado.

DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + "  " + pattern + "  " + output);

La salida de las líneas de código precedentes se describe en la siguiente tabla. El valor es el número, un double, que será formateado. El Patrón es el String que específica las propiedades de formateo. La Salida, que es un String, representa el número formateado.

Valor Patrón Salida Explicación
123456.789 ###,###.### 123,456.789 El signo Almohadilla (#) indica un dígito, la coma la posición del separador de millares y el punto la posición del separador decimal.
123456.789 ###.## 123456.79 El valor tiene tres dígitos a la derecha del punto decimal, pero el patrón sólo tiene dos. El método format maneja esto redondeando.
123.78 000000.000 000123.780 El patrón específica relleno con ceros, porque se utiliza el caracter Cero en vez de la almohadilla (#).
12345.67 $###,###.### $12,345.67 El primer carácter del patrón es el signo del dólar ($). Observa que este signo precede inmediatamente al dígito más a la izquierda de la salida formateada.
12345.67 \u00a5###,###.### ¥12,345.67 El patrón específica el signo del Yen Japonés (¥) con su valor Unicode \u00a5.

. Formateo Sensible a la Localidad

El ejemplo anterior creaba un objeto DecimalFormat para la Localidad por defecto. Si se quiere un objeto DecimalFormat para una localidad distinta, se ejemplariza un NumberFormat y luego se fuerza a DecimalFormat. Entonces, el objeto DecimalFormat formetará los patrones definidos de una forma sensible a la localidad. Aquí se puede ver un ejemplo.

NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern(pattern);
String output = df.format(value);
System.out.println(pattern + "  " + output + "  " + loc.toString());

Abajo podemos ver el resultado de la ejecución de este código. Los números formateados, en la segunda columna, varían con la Localidad.

###,###.###  123,456.789  en_US
###,###.###  123.456,789  de_DE
###,###.###  123 456,789  fr_FR

Por eso, los patrones de formateo que hemos utilizado hasta ahora seguían las convenciones del Inglés Norteamericano. Por ejemplo, en el patrón "###,###.##" la coma es el separador de millares y el punto representa el punto decimal. Esta convención está bien, sabiendo que los usuarios finales no están expuestos a ellas. Sin embargo, algunas aplicaciones, como las hojas de cálculo y los generadores de informes, permiten al usuario final definir sus propios patrones de formateo. Para esas aplicaciones, los patrones de formateo especificados por el usuario final deberían utilizar la notación localizada. En estos casos querremos llamar al método applyLocalizedPattern sobre el objeto DecimalFormat.

. Modificar los Símbolos de Formateo

Con la clase DecimalFormatSymbols se pueden modificar los símbolos que aparecen en los números formateados porducidos por el método format. Estos símbolos incluyen el punto decimal, el separador de millares, el signo menos, y el signo de porcentaje además de algunos más.

En el siguiente ejemplo podemos ver el uso de DecimalFormatSymbols aplicando un formato inusual a un número. Empezamos ejemplarizando DecimalFormatSymbols sin argumentos, lo que devuelve un objeto para la Localidad por defecto, (Como DecimalFormatSymbols es una clase sensible a la Localidad, podríamos haber específicado una Localidad cuando llamamos al constructor.) Luego, modificamos el separador decimal y el de millares. Luego específicamos el DecimalFormatSymbols cuando ejemplarizamos la clase DecimalFormat. Sólo para hacer las cosas más complicadas, cambiamos la numero de agrupamiento del formateador de tres a cuatro. Finalmente llamamos al método format.

Aquí tienes el código de Ejemplo.

DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols();
unusualSymbols.setDecimalSeparator('|');
unusualSymbols.setGroupingSeparator('^');

String strange = "#,##0.###";
DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
weirdFormatter.setGroupingSize(4);

String bizarre = weirdFormatter.format(12345.678);
System.out.println(bizarre);

Esto es lo que aparecerá cuando imprimamos este extraño número formateado

1^2345|678

. Síntaxis de los Patrones de Formateo de Números

Se pueden diseñar patrones personalizados para el formateo de números, siguiendo las siguientes reglas específicas por el diagrama BNF.

patrón    := subpatrón{;subpatrón}
subpatrón := /bbddentero{.fracción}{sufijo}
prefijo   := '\\u0000'..'\\uFFFD' - CaracteresEspeciales
sufijo    := '\\u0000'..'\\uFFFD' - CaracteresEspeciales
entero    := '#'* '0'* '0'
fracción  := '0'* '#'*

La notación utilizada en el diagrama anterior se explica en la siguiente tabla.

Notación Descripción
X* 0 o más ejemplares de X
(X | Y) X o Y
X..Y cualquier caracter de X a Y, inclusives
S - T Los caracteres que estén en S, exceptos los que estén en T
{X} X es opcional

En el digrama BNF anteiror, el primer subpatrón especifica el formato para números positivos. El segundo es opcional, específica el el formato para números negativos.

Aunque no está en el diagrama BNF, puede aparecer una coma dentro de la porción "entero".

Dentro de los subpatrones, se específica el formato con símbolos especiales. Esto símbolos se describen en esta tabla.

Símbolo Descripción
0 Un dígito
# Un dígito, se muestra 0 si no existe
. Situación del separador decimal
, Situación del separador de millares
E Separa el exponente y la mantisa para formatos exponenciales
; Separa formatos
- Prefijo negativo por defecto
% Multiplica por 100 y lo muestra como porcentaje
? Multiplica por 1000 y lo muestra como por mil
¤ signo de moneda, reemplazado por un símbolo de moneda; Si es doble, reemplazado por el símbolo de moneda internacional; si está presente en el patrón, se utiliza el separador decimal monetario en vez de el separador decimal.
X Se puede utilizar cualquier otro caracter como prefijo o sufijo
' utilizado para enmarcar caracteres especiales en prefijos o sufijos.
 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad
Mantenida por: Claudio y Dani.

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: jugar gratis | amor | navidad 2009 | registro de dominios | servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados