31

我想使用 Java 的 DecimalFormat 来格式化双精度数,如下所示:

#1 - 100 -> $100
#2 - 100.5 -> $100.50
#3 - 100.41 -> $100.41

到目前为止,我能想到的最好的是:

new DecimalFormat("'$'0.##");

但这不适用于案例 #2,而是输出“$100.5”

编辑:

许多这些答案只考虑案例#2和#3,并没有意识到他们的解决方案会导致#1将100格式化为“$100.00”,而不仅仅是“$100”。

4

10 回答 10

23

它必须使用DecimalFormat吗?

如果没有,它看起来像以下应该工作:

String currencyString = NumberFormat.getCurrencyInstance().format(currencyNumber);
//Handle the weird exception of formatting whole dollar amounts with no decimal
currencyString = currencyString.replaceAll("\\.00", "");
于 2011-02-17T19:15:14.683 回答
7

使用数字格式:

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

此外,不要使用双精度来表示精确值。如果您在诸如蒙特卡洛方法之类的方法中使用货币值(无论如何值都不准确),则首选双精度值。

另请参阅:编写 Java 程序来计算和格式化货币

于 2011-02-17T19:14:38.767 回答
6

尝试

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
于 2011-02-17T19:12:34.390 回答
2

尝试使用

DecimalFormat.setMinimumFractionDigits(2);
DecimalFormat.setMaximumFractionDigits(2);
于 2011-02-17T19:15:55.413 回答
1

您可以检查“是否为整数”并选择所需的数字格式。

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
于 2012-11-23T06:25:36.143 回答
1

您可以使用以下格式:

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

于 2014-05-12T09:06:44.023 回答
1

您可以尝试根据条件使用两个不同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
于 2017-06-19T12:59:45.870 回答
1

您可以使用 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);
于 2019-05-13T14:45:32.447 回答
1

我知道为时已晚。但是以下对我有用:

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.   

希望这对将来阅读此内容的人有所帮助:)

于 2017-01-14T17:55:10.523 回答
-1

printf 也可以。

例子:

双任意数 = 100; printf("值为 %4.2f ", anyNumber);

输出:

值为 100.00

4.2 表示强制数字在小数点后有两位数。4 控制小数点右侧的位数。

于 2013-03-08T03:04:19.827 回答