Ответ 1
String.format("%.2fM", theNumber/ 1000000.0);
Для получения дополнительной информации см. String.format javadocs.
Есть ли способ использовать 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.
String.format("%.2fM", theNumber/ 1000000.0);
Для получения дополнительной информации см. String.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));
Посмотрите ChoiseFormat.
Более упрощенным способом было бы использовать обертку, которая автоматически делится на 1 м для вас.
На данный момент вы должны использовать ICU CompactDecimalFormat
, который локализует результат форматирования для неанглийских локалей. Другие локали могут не использовать суффикс "Миллионы".
Эта функциональность будет стандартной Java в JDK 12 с CompactNumberFormat
.
Для тех, кто ищет там, чтобы преобразовать данную цифру в удобочитаемую форму.
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);
}