Java: номер формата в миллионах

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

1,000,000 = > 1,00 М

1,234,567 = > 1,23 М

1,234,567,890 = > 1234,57 млн.

В основном разделение некоторого числа на 1 миллион, сохранение 2 десятичных знаков и пощечина "M" на конце. Я думал о создании нового подкласса 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.

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Здесь находится подкласс 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...");
    }
};

Ответ 4

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

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

Ответ 5

Посмотрите ChoiseFormat.

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

Ответ 7

Для тех, кто ищет там, чтобы преобразовать данную цифру в удобочитаемую форму.

public static String getHumanReadablePriceFromNumber(long number){

    if(number >= 1000000000){
        return String.format("%.2fB", number/ 1000000000.0);
    }

    if(number >= 1000000){
        return String.format("%.2fM", number/ 1000000.0);
    }

    if(number >= 100000){
        return String.format("%.2fL", number/ 100000.0);
    }

    if(number >=1000){
        return String.format("%.2fK", number/ 1000.0);
    }
    return String.valueOf(number);

}