NumberFormat ou DecimalFormat, formatar números reais em Java

Postado em por Wolmir Cezer Garbin em Java | 177 Visualizações
Última atualização em:

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.

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.

Wolmir Cezer Garbin

Wolmir Cezer Garbin


Sou formado em Desenvolvimento de Sistemas para Internet pela faculdade Mater Dei e Pós graduado em Desenvolvimento de sistemas em Java pela UTFPR. Trabalho a mais de 9 anos com desenvolvimento em Java, Android e Web utilizando as principais tecnologias do mercado. Atuo como professor na faculdade Mater Dei, programador na Garbo Software e criador do Receitas de Código.

Ver mais

Posts relacionados


Code Conference

Esta é uma conferência de código realizada na cidade de Pato Branco para dissiminar tendências e informações sobre programação e novas tecnológias

Veja mais sobre o Code Conference

Publique seu post no Receitas de Código

Agora você pode publicar seu post no Receitas de Código e compartilhar seu conhecimento com muitas pessoas!

Quero publicar