Как использовать Java DecimalFormat для "умного" форматирования валюты?
Я хотел бы использовать Java DecimalFormat для форматирования удвоений, например:
#1 - 100 -> $100
#2 - 100.5 -> $100.50
#3 - 100.41 -> $100.41
Лучшее, что я могу придумать до сих пор:
new DecimalFormat("'$'0.##");
Но это не работает для случая №2 и вместо этого выводит "$ 100,5"
Edit:
Многие из этих ответов рассматривают только случаи № 2 и № 3 и не понимают, что их решение приведет к тому, что №1 будет форматировать 100 как "100 долларов США" вместо "100 долларов США".
Ответы
Ответ 1
Нужно ли использовать DecimalFormat
?
Если нет, то выглядит следующим образом:
String currencyString = NumberFormat.getCurrencyInstance().format(currencyNumber);
//Handle the weird exception of formatting whole dollar amounts with no decimal
currencyString = currencyString.replaceAll("\\.00", "");
Ответ 2
Использовать NumberFormat:
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);
double doublePayment = 100.13;
String s = n.format(doublePayment);
System.out.println(s);
Кроме того, не используйте двойные символы для представления точных значений. Если вы используете значения валюты в чем-то вроде метода Монте-Карло (где значения в любом случае не являются точными), предпочтительнее использовать double.
Смотрите также: Напишите программы Java для расчета и форматирования валюты
Ответ 3
Try
new DecimalFormat("'$'0.00");
Edit:
Я пробовал
DecimalFormat d = new DecimalFormat("'$'0.00");
System.out.println(d.format(100));
System.out.println(d.format(100.5));
System.out.println(d.format(100.41));
и получил
$100.00
$100.50
$100.41
Ответ 4
Попробуйте использовать
DecimalFormat.setMinimumFractionDigits(2);
DecimalFormat.setMaximumFractionDigits(2);
Ответ 5
Вы можете проверить "целое число или нет" и выбрать нужный формат номера.
public class test {
public static void main(String[] args){
System.out.println(function(100d));
System.out.println(function(100.5d));
System.out.println(function(100.42d));
}
public static String function(Double doubleValue){
boolean isWholeNumber=(doubleValue == Math.round(doubleValue));
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols(Locale.GERMAN);
formatSymbols.setDecimalSeparator('.');
String pattern= isWholeNumber ? "#.##" : "#.00";
DecimalFormat df = new DecimalFormat(pattern, formatSymbols);
return df.format(doubleValue);
}
}
даст именно то, что вы хотите:
100
100.50
100.42
Ответ 6
Вы можете использовать следующий формат:
DecimalFormat dformat = new DecimalFormat ( "$ #. ##" );
Ответ 7
Я знаю его слишком поздно. Однако следующие работали для меня:
DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.UK);
new DecimalFormat("\u00A4#######0.00",otherSymbols).format(totalSale);
\u00A4 : acts as a placeholder for currency symbol
#######0.00 : acts as a placeholder pattern for actual number with 2 decimal
places precision.
Надеюсь, это поможет тому, кто читает это в будущем:)
Ответ 8
Вы можете попробовать, используя два разных объекта DecimalFormat
на основе условия следующим образом:
double d=100;
double d2=100.5;
double d3=100.41;
DecimalFormat df=new DecimalFormat("'$'0.00");
if(d%1==0){ // this is to check a whole number
DecimalFormat df2=new DecimalFormat("'$'");
System.out.println(df2.format(d));
}
System.out.println(df.format(d2));
System.out.println(df.format(d3));
Output:-
$100
$100.50
$100.41
Ответ 9
Вы можете использовать Java Money API для достижения этой цели. (хотя это не использует DecialFormat)
long amountInCents = ...;
double amountInEuro = amountInCents / 100.00;
String customPattern;
if (minimumOrderValueInCents % 100 == 0) {
customPattern = "# ¤";
} else {
customPattern = "#.## ¤";
}
Money minDeliveryAmount = Money.of(amountInEuro, "EUR");
MonetaryAmountFormat formatter = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder.of(Locale.GERMANY)
.set(CurrencyStyle.SYMBOL)
.set("pattern", customPattern)
.build());
System.out.println(minDeliveryAmount);
Ответ 10
printf также работает.
Пример:
double anyNumber = 100;
printf ( "Значение% 4.2f", anyNumber);
Вывод:
Значение 100.00
4.2 означает, что число должно иметь две цифры после десятичной. 4 управляет количеством цифр справа от десятичной дроби.