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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top