Java: форматировать число в миллионах - PullRequest
11 голосов
/ 09 февраля 2009

Есть ли способ использовать DecimalFormat (или какой-либо другой стандартный форматер) для форматирования чисел, как это:

1 000 000 => 1,00M

1,234,567 => 1,23M

1,234,567,890 => 1234,57M

В основном, разделив некоторое число на 1 миллион, сохранив 2 десятичных знака, и добавив в конце букву «М». Я думал о создании нового подкласса NumberFormat, но он выглядит сложнее, чем я предполагал.

Я пишу API с методом форматирования, который выглядит следующим образом:

public String format(double value, Unit unit); // Unit is an enum

Внутренне я отображаю объекты Unit в NumberFormatters. Реализация примерно такая:

public String format(double value, Unit unit)
{
    NumberFormatter formatter = formatters.get(unit);
    return formatter.format(value);
}

Обратите внимание, что из-за этого я не могу ожидать, что клиент разделит на 1 миллион, и я не могу просто использовать String.format (), не помещая его в NumberFormatter.

Ответы [ 6 ]

18 голосов
/ 09 февраля 2009
String.format("%.2fM", theNumber/ 1000000.0);

Для получения дополнительной информации см. String.format javadocs .

4 голосов
/ 10 февраля 2009

Обратите внимание, что если у вас есть BigDecimal, вы можете использовать метод movePointLeft:

new DecimalFormat("#.00").format(value.movePointLeft(6));
3 голосов
/ 09 февраля 2009

Почему не просто?

DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));
3 голосов
/ 09 февраля 2009

Вот подкласс NumberFormat, который я выбрал. Похоже, что это делает работу, но я не совсем уверен, что это лучший способ:

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...");
    }
};
0 голосов
/ 18 марта 2019

На данный момент вы должны использовать ICU CompactDecimalFormat, который локализует результат форматирования для неанглийских локалей. Другие локали могут не использовать суффикс «Миллионы».

Эта функциональность будет стандартной Java в JDK 12 с CompactNumberFormat.

0 голосов
/ 09 февраля 2009

Взгляните на ChoiseFormat .

Более простой способ - использовать упаковщик, который автоматически делится на 1 м.

...