2013-05-16 36 views
4

我試圖使用DecimalFormat格式化價格,但這不適用於所有變體。使用DecimalFormat格式化數字

DecimalFormat df = new DecimalFormat("0.##") 
df.format(7.8) 
df.format(85.0) 

打印

7.80 

85 

但 「7.79999」 被格式化爲 「7.8」,而不是 「7.80」。我曾嘗試這樣做,讓

DecimalFormat df = new DecimalFormat("0.00") 

迫使兩個DP,但隨後「85.0」被格式化爲「85.00」而不是「85」!

是否有一種捕獲所有變化的方法,以便價格打印爲#,##或#。##?例如:

5,55,5.55,5.50,500,500.40

+0

http://stackoverflow.com/questions/5033404/how-to-use-javas-decimalformat- for-smart-currency-formatting – Zutty

回答

5

這似乎不能由單一formatter來解決。我建議你使用「0.00」格式並用空字符串替換「.00」。

public static String myFormat(double number) { 
    DecimalFormat df = new DecimalFormat("0.00"); 
    return df.format(number).replaceAll("\\.00$", ""); 
} 
1

使用的BigDecimal數類,而不是:

例如如果n是一個BigDecimal, 那麼你可以使用

String s = NumberFormat.getCurrencyInstance().format(n); 

順便說一句,這是用錢而工作時使用BigDecimal的最佳實踐。

+0

謝謝,但這不會刪除尾隨零,例如5.0和5.00 – Jon

+0

好吧,比較字符串與這個正則表達式[0-9] * [。] 0+:if(s.matches(「[0-9] * [。] 0+」))「strip off the這段時間和之後的東西「。這也將照顧像5甚至3位數貨幣(其中有一些還在)。 – Bathsheba

3

我不認爲這是可能的,至少不是與Java SE格式化程序。您需要製作一個自定義格式器。我會這樣做

String res = df.format(number).replace(".00", ""); 
6

這兩種格式之間略有不同。 「#。##」表示它將打印最多兩位小數的數字,而「#.00」表示它將始終顯示兩位小數,如果小數位數小於兩位,它將用零替換它們。看到下面的例子與輸出。

public static final DecimalFormat df1 = new DecimalFormat("#.##"); 
public static final DecimalFormat df2 = new DecimalFormat("#.00"); 

System.out.println(df1.format(7.80)); 
System.out.println(df1.format(85)); 
System.out.println(df1.format(85.786)); 

System.out.println(df2.format(7.80)); 
System.out.println(df2.format(85)); 
System.out.println(df2.format(85.786)); 

和輸出將

7.8 
85 
85.79 

7.80 
85.00 
85.79 
+0

是的,我知道謝謝,但我需要涵蓋這些功能,所以7.79999打印7。80和85.00打印85 – Jon

+0

恐怕不能用內置的格式化程序。您將不得不手動格式化結果字符串。也許通過刪除最後的字符,如果他們是00s – Raza

+0

Ooops,沒有看到@EvgeniyDorofeev的答案,那是你唯一的可能性 – Raza

-1
System.out.println(new java.text.DecimalFormat("#.##").format(5.00)); 

這將打印5

System.out.println(new java.text.DecimalFormat("#.00").format(500.401)); 

這將打印500.40

相關問題