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.
Última atualização em: | 45934 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.