Как использовать Java DecimalFormat для «умного» форматирования валюты? - PullRequest
29 голосов
/ 17 февраля 2011

Я бы хотел использовать десятичный формат Java для форматирования двойных чисел, например:

#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,00» вместо «$ 100».

Ответы [ 10 ]

22 голосов
/ 17 февраля 2011

Нужно ли использовать DecimalFormat?

Если нет, похоже, должно работать следующее:

String currencyString = NumberFormat.getCurrencyInstance().format(currencyNumber);
//Handle the weird exception of formatting whole dollar amounts with no decimal
currencyString = currencyString.replaceAll("\\.00", "");
6 голосов
/ 17 февраля 2011

Использовать NumberFormat:

NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
double doublePayment = 100.13;
String s = n.format(doublePayment);
System.out.println(s);

Кроме того, не используйте double для представления точных значений. Если вы используете валютные значения в чем-то похожем на метод Монте-Карло (где значения в любом случае не точны), предпочтительным является значение double.

См. Также: Написание программ на Java для расчета и форматирования валюты

5 голосов
/ 17 февраля 2011

Попробуйте

new DecimalFormat("'$'0.00");

Редактировать:

Я попробовал

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
2 голосов
/ 17 февраля 2011

Попробуйте использовать

DecimalFormat.setMinimumFractionDigits(2);
DecimalFormat.setMaximumFractionDigits(2);
1 голос
/ 19 июня 2017

Вы можете попробовать использовать два различных объекта 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
1 голос
/ 14 января 2017

Я знаю, что слишком поздно.Однако следующее сработало для меня:

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.   

Надеюсь, это поможет тому, кто прочтет это в будущем:)

1 голос
/ 12 мая 2014

Вы можете использовать следующий формат:

DecimalFormat dformat = new DecimalFormat ("$ #. ##");

1 голос
/ 23 ноября 2012

Вы можете проверить «является целым числом или нет» и выбрать нужный формат числа.

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
0 голосов
/ 13 мая 2019

Вы можете использовать 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);
0 голосов
/ 08 марта 2013

printf также работает.

Пример:

double anyNumber = 100; printf («Значение равно% 4.2f», anyNumber);

Выход:

Значение 100,00

4.2 означает, что число должно иметь две цифры после десятичной дроби. 4 управляет количеством цифр справа от десятичной дроби.

...