簡體   English   中英

如何使用Java的DecimalFormat進行“智能”貨幣格式化?

[英]How to use Java's DecimalFormat for “smart” currency formatting?

我想使用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”。

是否必須使用DecimalFormat

如果沒有,看起來應該如下:

String currencyString = NumberFormat.getCurrencyInstance().format(currencyNumber);
//Handle the weird exception of formatting whole dollar amounts with no decimal
currencyString = currencyString.replaceAll("\\.00", "");

使用NumberFormat:

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

另外,請勿使用雙精度來表示精確值。 如果您在蒙特卡羅方法中使用貨幣值(其中值無論如何都不准確),則首選double。

另請參閱: 編寫Java程序以計算和格式化貨幣

嘗試

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

嘗試使用

DecimalFormat.setMinimumFractionDigits(2);
DecimalFormat.setMaximumFractionDigits(2);

您可以選中“是否為全數”並選擇所需的數字格式。

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

您可以使用以下格式:

DecimalFormat dformat = new DecimalFormat(“$#。##”);

我知道為時已晚。 然而,以下為我工作:

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.   

希望這能幫助將來讀這個的人:)

您可以根據條件嘗試使用兩個不同的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

您可以使用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);

printf也有效。

例:

double anyNumber = 100; printf(“值為%4.2f”,anyNumber);

輸出:

值為100.00

4.2表示強制數字在小數點后有兩位數。 4控制小數點右邊的位數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM