NumberFormat ou DecimalFormat, formatar números reais em Java

As duas classes tem funções parecidas para a formatação de números decimais em java, porém é importante saber o contexto de uso para usar uma ou outra.

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Java - TUTORIAL

Última atualização em: | 44528 Visualizações

Usando NumberFormat

A classe NumberFormat, faz parte do pacote java.text e permite formatar números conforme a localização geográfica. A classe realiza a distinção entre o sinal de ponto, milhar e de decimal, também identifica a posição do sinal do número e identifica o prefixo que indica a moeda em caso de valores monetários.

A Classe NumberFormat possui três mêtodos para formatar números, valores monetários e percentuais. É uma boa opção para formatar valores monetários. Antes de utilizar, deve fazer a importação, um exemplo da utilização pode ser observado a seguir:

import java.text.NumberFormat;
...
String valorFormatado = NumberFormat.getCurrencyInstance().format(12005.11);
System.out.println( valorFormatado );

A saída será: R$ 12.005,11

Usando DecimalFormat

A classe DecimalFormat também faz parte do pacote java.text e permite formatar números reais, porém uma particularidade é que ela permite que seja informado o a forma a ser formatado o valor. Você pode usar a classe DecimalFormat para formatar números decimais em seqüências específicas para a localidade. Esta classe permite-lhe controlar a exibição da esquerda e à quantidade de zeros à direita, prefixos e sufixos, agrupando (milhares) separadores, e o separador decimal. Se você quer mudar símbolos de formatação, tais como separador decimal, você pode usar os DecimalFormatSymbols em conjunto com a classe DecimalFormat. Essas classes oferecem uma grande flexibilidade na formatação de números, mas eles podem fazer seu código mais complexo.

Você especifica as propriedades de formatação de DecimalFormat com uma cadeia de caracteres padrão. O padrão determina o que o número formatado parece.

Para entender como formatar, analise os caracteres e descrições dos simbolos:

  • (0) Um dígito, caso não esteja presente adiciona 0
  • (#) Um dígito, de zero mostra como ausente
  • (.) Espaço reservado para separador decimal
  • (,) Espaço reservado para o agrupamento separador

Estes são os símbolos mais utilizados. Existem outros símbolos que não estão na lista mas podem ser entendidos no próprio site da oracle, pelo link: https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

Para criar o mesmo exemplo mostrado com NumberFormat, observe o código a seguir:

import java.text.DecimalFormat;
...
String valorFormatado = new DecimalFormat("#,##0.00").format(12005.11);
System.out.println( valorFormatado );

A saída será: 12.005,11

Entendemos que a classe DecimalFormat permite formatar valores em diferentes padrões, dessa forma existe uma maior liberdade. O exemplo mostrado, cria um objeto DecimalFormat para a localidade padrão. Se você quer um objeto DecimalFormat para outro local, precisa instanciar um NumberFormat e depois lançá-lo para DecimalFormat. Aqui está um exemplo:

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

O resultado pode mostrar variação de acordo com a localidade, ou seja para cada localidade pode ter diferentes saídas:

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

Alterar os símbolos de formatação

Você pode usar a classe DecimalFormatSymbols para mudar os símbolos que aparecem nos números formatados produzidas pelo método de formato. Estes símbolos incluem o separador decimal, o separador de agrupamento, o sinal de menos, e o sinal de porcentagem, entre outros.

Veja um exemplo:

DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale);
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);

O resultado produzido será: 1^2345|678

Ficou com alguma dúvida, comente abaixo e retornamos com a solução.


Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.


Apoiadores

Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!