Джава:Формат числа в миллионах
-
22-08-2019 - |
Вопрос
Есть ли способ использовать 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
.