DecimalFormat Pattern

De ChuWiki


Qué es DecimalFormat Pattern[editar]

DecimalFormat Pattern es el "patrón" que queremos que muestren los números cuando los presentamos al usuario. Por ejemplo, con dos decimales, como porcentaje, como moneda, con cinco cifras siempre rellenando con ceros por delante si es necesario, etc.

La clase DecimalFormat de java permite definir el patrón que queramos usar y luego convertir el número a texto.

Para ello, instanciamos DecimalFormat pasando como parámetro el patrón que queramos que tenga. Este patrón no es más que una cadena de texto con un formato específico. Veamos este formato con detalle, de menos complejo a más complejo.

Número de cifras[editar]

Podemos indicar cuántas cifras queremos con un patrón de este estilo "####" o bien de este otro "0000". En ambos casos indicamos que queremos cuatro cifras. La diferencia es que con #, no se pintarán los ceros del principio mientras que con 0 se está forzando a que se pinten ceros al principio si no hay cifras significativas. Veamos el ejemplo

DecimalFormat df = new DecimalFormat("####");
System.out.println( df.format(12));     // Saca por pantalla 12

df = new DecimalFormat("0000");
System.out.println( df.format(12));     // Saca por pantalla 0012

Si ponemos menos # o 0 de lo que necesita el número, se escribirán todas las cifras, sin recortar.

DecimalFormat df = new DecimalFormat("##");
System.out.println( df.format(1234));     // Saca por pantalla 1234

df = new DecimalFormat("00");
System.out.println( df.format(1234));     // Saca por pantalla 1234


Número de decimales[editar]

En el patrón podemos poner un punto decimal seguido de # o 0. El significado de estos últimos es el mismo, fuerza a o no a poner ceros decimales hasta completar el número de cifras decimales deseadas. En el patrón siempre es un punto para separar los decimales. Según tu idioma, el resultado puede mostrar una coma o un punto.

DecimalFormat df = new DecimalFormat("##.##");
System.out.println( df.format(1234));     // Saca por pantalla 1234

df = new DecimalFormat("00.00");
System.out.println( df.format(1234));     // Saca por pantalla 1234.00

Sin embargo, en este caso y al contrario que con la parte entera, en este caso si se recorta el número de decimales a los que queremos mostrar cómo máximo. Y el recorte se redondea al más cercano.

DecimalFormat df = new DecimalFormat("##.##");
System.out.println( df.format(12.345));     // Saca por pantalla 12.35  (no 12.34, por ser el tercer decimal un 6)

df = new DecimalFormat("00.00");
System.out.println( df.format(12.344));     // Saca por pantalla 12.34  (al ser el tercer decimal un 4, no incrementa el segundo)

Separador de miles[editar]

En el patrón, el separador de miles es una coma ",". Si la ponemos, aparecerá el separador de miles. Según tu país, puede aparecer una coma o un punto, pero en el patrón siempre es una coma. Si no lo pones, no aparecerá

DecimalFormat df = new DecimalFormat("#,###.##");
System.out.println(df.format(123456));  // Saca por pantalla 123.455
System.out.println(df.format(123.456));  // Saca por pantalla 1.234,46

Notación científica[editar]

Si queremos notación científica, por ejemplo, 1.23E15', podemos poner 'E0'. La 'E' para usar notación cientfífica y el 0 porque necesitamos que el exponente tenga obligatoriamente al menos un número. No podemos poner 'E#', ya que la '#' puede o no pintar un número.

DecimalFormat df = new DecimalFormat("#.##E0");
System.out.println(df.format(1234567));  // Saca por pantalla 1,23E6
System.out.println(df.format(123456789012.3456)); // Saca por pantalla 1,23E11

Porcentajes[editar]

El símbolo % multimplica nuestro número por 100 y lo muestra como porcentaje

DecimalFormat df = new DecimalFormat("00.00%");
System.out.println(df.format(1));  // Saca por pantalla 100,00%
System.out.println(df.format(0.04)); // Sacal por pantalla 04,00%

Sólo se puede poner al principio o al final del patrón.

Tanto por 1000[editar]

El símbolo multiplica nuestro número por 1000 y lo representa como un tanto por mil.

df = new DecimalFormat("00.00‰");
System.out.println(df.format(1));  // 1000,00‰
System.out.println(df.format(0.94)); // 940,00‰

Si nos resulta más sencillo, podemos poner \u2030

df = new DecimalFormat("00.00\u2030");
System.out.println(df.format(1));  // 1000,00‰
System.out.println(df.format(0.94)); // 940,00‰


Moneda[editar]

El símolo ¤ se utiliza como comodín para representar una moneda. Si lo usamos en el patrón, será sustituido por el símbolo de la moneda en tu locale (€, $, etc). Si se pone dos veces, se reemplazará por la abreviatura oficial de la moneda (EUR, USD, etc)

DecimalFormat df = new DecimalFormat("#.00¤");
System.out.println(df.format(12));  // Saca por pantalla 11,94€
System.out.println(df.format(11.94)); // Saca por pantalla 11.94€

df = new DecimalFormat("#.00¤¤");
System.out.println(df.format(12));  // Saca por pantalla 12,00EUR
System.out.println(df.format(11.94)); // Saca por pantalla 11,94EUR

Si nos resulta más sencillo, podemos poner \u00A4

DecimalFormat df = new DecimalFormat("#.00\u00A4");
System.out.println(df.format(12));  // Saca por pantalla 11,94€
System.out.println(df.format(11.94)); // Saca por pantalla 11.94€

df = new DecimalFormat("#.00\u00A4\u00A4");
System.out.println(df.format(12));  // Saca por pantalla 12,00EUR
System.out.println(df.format(11.94)); // Saca por pantalla 11,94EUR

Texto literal[editar]

En el formato podemos poner cualquier texto, que aparecerá tal cual

DecimalFormat df = new DecimalFormat("#.00 km/h");
System.out.println(df.format(12));  // Saca por pantalla 12,00 km/h
System.out.println(df.format(11.94)); // Saca por pantalla 11,94 km/h

Si necesitamos poner una '#' o cualquier otro de los caracteres especiales, debemos ponerlo entre comillas simples

DecimalFormat df = new DecimalFormat("'#'#.00 km/h");
System.out.println(df.format(12));  // Saca por pantalla #12,00 km/h
System.out.println(df.format(11.94)); // Saca por pantalla #11,94 km/h

Patrón positivo y negativo[editar]

En el patrón podemos poner dos formatos separados por punto y coma. El primero aplicará a números positivos, el segundo a negativos. Si el número es negativo, se usará el mismo formato que el positivo, pero podemos cambiar el prefijo (singo -) y el sufijo (unidad monetaria, procentaje, etc). El siguiente ejemplo no tiene mucho sentido, pero sirve para ilustrarlo claramente.

DecimalFormat df = new DecimalFormat("#.##%;menos # puff");
System.out.println(df.format(0.5));  // Saca por pantalla 50%
System.out.println(df.format(-0.5)); // Saca por pantalla menos 50 puff

Vemos que el signo menos se ha cambiado por la palabra "menos" y que el símbolo de porcentaje se ha cambiado por "puff". El valor sin embargo ha sido multiplicado por 100, ya que la parte positiva del patrón dice que es un porcentaje.

Convertir Cadena a número[editar]

Podemos usar DecimalFormat para convertir un String a número. Unicamente, el patrón que pongamos debe coincidir con la cadena que vayamos a introducir. Puesto que los ejemplos sencillos serían triviales habiendo visto todo lo anterior, vamos directamente con un par de ejemplos no tan inmediatos.

DecimalFormat df = new DecimalFormat("#.00%");
System.out.println(df.parse("1,11%")); // Da 0.0111
System.out.println(df.parse("1.11")); // Error, falta el %

Vemos que el segundo caso da un error, ya que no hemos puesto el % y el patrón dice que tiene que tener un símbolo de porcentaje. Vemos también que interpreta 1.11% como porcentaje y nos devuelve el valor 0.0111 (tanto por 1).

df = new DecimalFormat("El número # es primo");
System.out.println(df.parse("El número 13 es primo")); // 13
System.out.println(df.parse("13 es primo")); // Error, falta parte del texto

En este caso, no hemos puesto todo el texto que dice el patrón.