Вопрос

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

1 000 000 => 1,00 М

1 234 567 => 1,23 М

1 234 567 890 => 1 234,57 М

По сути, деление некоторого числа на 1 миллион, сохранение двух десятичных знаков и добавление буквы «М» в конце.Я думал о создании нового подкласса 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.

Это было полезно?

Решение

String.format("%.2fM", theNumber/ 1000000.0);

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

Другие советы

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

new DecimalFormat("#.00").format(value.movePointLeft(6));

Вот подкласс 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...");
    }
};

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

DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));

Взгляни на Выбор формата.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top