La clase NumberFormat de Java permite dar formato a valores numéricos para poder mostrarlos de forma más adecuada. Por ejemplo, puede limitar el número de decimales de una valor real, permite mostrar los valores con separadores de miles, con símbolo de moneda o valores porcentuales.

Dispone de varios métodos que permiten instanciar objetos de su clase en función del tipo de formato que se desea aplicar:

  • public static final NumberFormat getCurrencyInstance()
    • Permite dar formato de moneda
  • public static final NumberFormat getIntegerInstance()
    • Permite dar formato de valor numérico sin decimales
  • public static final NumberFormat getNumberInstance()
    • Permite dar formato de número
  • public static final NumberFormat getPercentInstance()
    • Permite dar formato de valor porcentual
  • public static final NumberFormat getInstance()
    • Permite dar formato genérico

Todos esos métodos de instancia disponen de una segunda modalidad en la que se puede indicar un parámetro de la clase Locale. De esa manera se puede obligar que el formateo se realice siguiendo las características del país que se indique en el parámetro. Si no se utiliza ese parámetro, se utiliza la configuración de país que se dispone en el sistema.

La manera más sencilla de crear objetos de la clase Locale se hace indicando como parámetro el código del idioma siguiendo el estándar ISO 639-1. opcionalmente se puede indicar un segundo parámetro con el código de la región usando el estándar ISO 3166-1-alpha-2.

Por ejemplo, las siguientes líneas crean objetos Locale para el idioma español, el idioma inglés de Estados Unidos, o inglés de Gran Bretaña:

Locale español = new Locale("es");
Locale inglesUS = new Locale("en","US");
Locale inglesGB = new Locale("en","GB");

 El método format es el que retorna como String el valor numérico al que se ha aplicado el formato correspondiente en función del método usado para instanciar el objeto. Este método se utiliza pasando por parámetro el valor numérico al que se le quiere aplicar el formato, el cual puede ser de tipo double o long: y retorna en cualquier caso un String con el valor formateado:

  • public final String format(double number)
  • public final String format(long number)

Para establecer el número de decimales que se quieren obtener, en el caso de manejar valores de tipo double, se dispone de los siguientes métodos que limitan el número máximo y mínimo de decimales que se obtendrán al aplicar el formato correspondiente. En el parámetro nuevoValor se debe indicar el número de decimales a aplicar en cada caso:

Ejemplos de conversiones de valores numéricos a cadenas de tipo String siendo mostradas por la salida estándar:

double importe = -1234.56;
NumberFormat formatoImporte = NumberFormat.getCurrencyInstance();
//Si se desea forzar el formato español:
//formatoImporte = NumberFormat.getCurrencyInstance(new Locale("es","ES"));
System.out.println(formatoImporte.format(importe));
//Muestra -1.234,56 €
 
double porcentaje = 1.6345;
NumberFormat formatoPorcentaje = NumberFormat.getPercentInstance();
System.out.println(formatoPorcentaje.format(porcentaje));
//Muestra 163%
formatoPorcentaje.setMinimumFractionDigits(2);
System.out.println(formatoPorcentaje.format(porcentaje));
//Muestra 163,45%
 
double numero = 4874647.0/3;
NumberFormat formatoNumero = NumberFormat.getNumberInstance();
System.out.println(formatoNumero.format(numero));
//Muestra 1.624.882,333
formatoNumero.setMaximumFractionDigits(1);
System.out.println(formatoNumero.format(numero));
//Muestra 1.624.882,3

También se puede utilizar la clase DecimalFormat que es una subclase de NumberFormat comentada anteriormente. Con ella se puede crear un formato totalmente personalizado utilizando un patrón de tipo String.

Tras crear un objeto de dicha clase indicando el patrón, se puede utilizar el método format se da formato al valor que se pase como parámetro, retornando un objeto String con el valor formateado.

Ejemplo:

//Creación de un formato con separadores de decimales y millares, con 2 decimales
DecimalFormat formato = new DecimalFormat("#,###.00");
String valorFormateado = formato.format(123456.789);
//Muestra en pantalla el valor 123.456,79 teniendo en cuenta que se usa la puntuación española
System.out.println(valorFormateado);

Algunos ejemplos de patrones:

Valor Patrón Salida Descripción
123456.789 #,###.### 123,456.789 El carácter (#) equivale a un dígito, la coma es el lugar para el separados de miles, y el punto indica el lugar para el separador de decimales. 
123456.789 #.## 123456.79 El valor tiene tres dígitos en la parte decimal, pero el patrón sólo tiene 2, por lo que el método format hace un redondeo del valor hacia arriba.
123.78 000000.000 000123.780

El patrón especifica los ceros que se deben utilizarse en la parte entera y en la parte decimal, al utilizar el carácter 0 en lugar de #.

12345.67 $#,###.### $12,345.67

El primer carácter del patrón es el signo dólar, por lo que se muestra precediendo al valor en la salida formateada.

12345.67 \u00A5#,###.### ¥12,345.67

El patrón especifica el símbolo de la moneda japonesa Yen (¥) usando el valor Unicode 00A5.

12345.67 #,###.### ¤ 12.345,67 € El carácter ¤ del patrón indica el lugar en el que se muestra el carácter de la moneda usada en el país que tiene configurado el sistema operativo

Estos son los caracteres que se pueden utilizar para dar formato con el patrón:

Símbolo Descripción
0 Un dígito obligado aunque sea 0 
# Un dígito
. Lugar para el sepador de decimales
, Lugar para el separador de miles
E Separa la mantisa y el exponente para formatos exponenciales
; Separa formatos
- Prefijo por defecto para valores negativos
% Multiplica el valor por 100 y lo muestra como porcentaje
? Multiplica el valor por 1000 y lo muestra como por miles
¤ Símbolo de moneda
otro Cualquier carácter puede usarse en el prefijo o sufijo del valor
' Usado para citar caracteres especiales en el prefijo o sufijo del valor