Java: número Format em milhões
-
22-08-2019 - |
Pergunta
Existe uma maneira de usar DecimalFormat (ou algum outro formatador padrão) para formatar números como este:
1.000.000 => 1,00 M
1.234.567 => 1.23M
1234567890 => 1234.57M
Basicamente dividindo algum número de 1 milhão, mantendo 2 casas decimais, e batendo um 'M' no final. Eu tenho pensado sobre a criação de uma nova subclasse de NumberFormat mas parece mais complicado do que eu imaginava.
Eu estou escrevendo uma API que tem um método de formato parecido com este:
public String format(double value, Unit unit); // Unit is an enum
Internamente, eu estou mapeando Unidade de objetos para NumberFormatters. A implementação é algo como isto:
public String format(double value, Unit unit)
{
NumberFormatter formatter = formatters.get(unit);
return formatter.format(value);
}
Note que por causa disso, eu não posso esperar o cliente a dividir por 1 milhão, e eu não pode apenas usar String.format () sem envolvê-lo em uma NumberFormatter.
Solução
String.format("%.2fM", theNumber/ 1000000.0);
Para obter mais informações, consulte o String.format javadocs .
Outras dicas
Note que se você tiver um BigDecimal
, você pode usar o método movePointLeft
:
new DecimalFormat("#.00").format(value.movePointLeft(6));
Aqui está uma subclasse de NumberFormat que eu chicoteado até. Parece que ele faz o trabalho, mas eu não sou inteiramente certo que é a melhor maneira:
private static final NumberFormat MILLIONS = new NumberFormat()
{
private NumberFormat LOCAL_REAL = new DecimalFormat("#,##0.00M");
public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos)
{
double millions = number / 1000000D;
if(millions > 0.1) LOCAL_REAL.format(millions, toAppendTo, pos);
return toAppendTo;
}
public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos)
{
return format((double) number, toAppendTo, pos);
}
public Number parse(String source, ParsePosition parsePosition)
{
throw new UnsupportedOperationException("Not implemented...");
}
};
Por que não simplesmente?
DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));
Dê uma olhada ChoiseFormat .
Uma maneira mais simplista seria a utilização de um invólucro que auto dividido por 1 milhão para você.
Por enquanto, você deve usar UTI é CompactDecimalFormat
, que irá localizar o resultado formatação para localidades diferentes do inglês. Outros locais não pode usar um sufixo "Milhões".
Esta funcionalidade será padrão Java no JDK 12 com CompactNumberFormat
.