Java货币数字格式

有没有一种格式化小数的方法如下:

100 -> "100" 100.1 -> "100.10" 

如果是整数,则省略小数部分。 否则格式有两位小数。

我对此表示怀疑。 问题是如果它是一个浮点数,100从不是100,通常是99.9999999999或100.0000001或类似的东西。

如果你想以这种方式格式化,你必须定义一个epsilon,即一个整数的最大距离,如果差异较小,则使用整数格式,否则使用float。

像这样的事情会做的伎俩:

 public String formatDecimal(float number) { float epsilon = 0.004f; // 4 tenths of a cent if (Math.abs(Math.round(number) - number) < epsilon) { return String.format("%10.0f", number); // sdb } else { return String.format("%10.2f", number); // dj_segfault } } 

我build议使用java.text包:

 double money = 100.1; NumberFormat formatter = NumberFormat.getCurrencyInstance(); String moneyString = formatter.format(money); System.out.println(moneyString); 

这具有特定语言环境的附加好处。

但是,如果你必须,截断string,如果它是一个整数美元:

 if (moneyString.endsWith(".00")) { int centsIndex = moneyString.lastIndexOf(".00"); if (centsIndex != -1) { moneyString = moneyString.substring(1, centsIndex); } } 
 double amount =200.0; Locale locale = new Locale("en", "US"); NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale); System.out.println(currencyFormatter.format(amount)); 

要么

 double amount =200.0; System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US")) .format(amount)); 

显示货币的最佳方式

产量

$ 200.00

如果你不想使用符号使用这种方法

 double amount = 200; DecimalFormat twoPlaces = new DecimalFormat("0.00"); System.out.println(twoPlaces.format(amount)); 

200.00

这也可以用(用千分机)

 double amount = 2000000; System.out.println(String.format("%,.2f", amount)); 

2,000,000.00

谷歌search后我没有find任何好的解决scheme,只是发布我的解决scheme,以供其他参考。 使用priceToString来格式化货币。

 public static String priceWithDecimal (Double price) { DecimalFormat formatter = new DecimalFormat("###,###,###.00"); return formatter.format(price); } public static String priceWithoutDecimal (Double price) { DecimalFormat formatter = new DecimalFormat("###,###,###.##"); return formatter.format(price); } public static String priceToString(Double price) { String toShow = priceWithoutDecimal(price); if (toShow.indexOf(".") > 0) { return priceWithDecimal(price); } else { return priceWithoutDecimal(price); } } 

是。 你可以使用java.util.formatter 。 您可以使用格式化string,如“%10.2f”

我正在使用这个(使用来自commons-lang的StringUtils):

 Double qty = 1.01; String res = String.format(Locale.GERMANY, "%.2f", qty); String fmt = StringUtils.removeEnd(res, ",00"); 

你只能照顾的地区和相应的string砍。

我认为印刷货币这一点很简单明了:

 DecimalFormat df = new DecimalFormat("$###,###.##"); // or pattern "###,###.##$" System.out.println(df.format(12345.678)); 

产出:12,345.68美元

以及这个问题的可能解决scheme之一:

 public static void twoDecimalsOrOmit(double d) { System.out.println(new DecimalFormat(d%1 == 0 ? "###.##" : "###.00").format(d)); } twoDecimalsOrOmit((double) 100); twoDecimalsOrOmit(100.1); 

输出:

100

100.10

你应该这样做:

 public static void main(String[] args) { double d1 = 100d; double d2 = 100.1d; print(d1); print(d2); } private static void print(double d) { String s = null; if (Math.round(d) != d) { s = String.format("%.2f", d); } else { s = String.format("%.0f", d); } System.out.println(s); } 

打印:

100

100,10

我知道这是一个古老的问题,但…

 import java.text.*; public class FormatCurrency { public static void main(String[] args) { double price = 123.4567; DecimalFormat df = new DecimalFormat("#.##"); System.out.print(df.format(price)); } } 

你可以做这样的事情,然后通过整数,然后分钱。

 String.format("$%,d.%02d",wholeNum,change); 

我同意@duffymo你需要使用java.text.NumberFormat方法这种事情。 实际上,您可以在本地执行所有格式化,而无需执行任何string比较:

 private String formatPrice(final double priceAsDouble) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); if (Math.round(priceAsDouble * 100) % 100 == 0) { formatter.setMaximumFractionDigits(0); } return formatter.format(priceAsDouble); } 

几位指出:

  • 整个Math.round(priceAsDouble * 100) % 100只是解决双/浮动的不准确性。 基本上只是检查我们是否到了数百个地方(也许这是美国的偏见)还有余下的美分。
  • 删除小数的技巧是setMaximumFractionDigits()方法

无论您确定小数是否应被截断的逻辑,都应该使用setMaximumFractionDigits()

如果你想使用货币,你必须使用BigDecimal类。 问题是,没有办法在内存中存储一​​些浮点数(例如,你可以存储5.3456,而不是5.3455),这可能会影响计算。

有一篇很好的文章如何与BigDecimal和货币合作:

http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html

格式从1000000.2到1 000 000,20

 private static final DecimalFormat DF = new DecimalFormat(); public static String toCurrency(Double d) { if (d == null || "".equals(d) || "NaN".equals(d)) { return " - "; } BigDecimal bd = new BigDecimal(d); bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP); DecimalFormatSymbols symbols = DF.getDecimalFormatSymbols(); symbols.setGroupingSeparator(' '); String ret = DF.format(bd) + ""; if (ret.indexOf(",") == -1) { ret += ",00"; } if (ret.split(",")[1].length() != 2) { ret += "0"; } return ret; } 

这篇文章真的帮助我终于得到我想要的东西。 所以我只是想在这里贡献我的代码来帮助别人。 这是我的代码和一些解释。

以下代码:

 double moneyWithDecimals = 5.50; double moneyNoDecimals = 5.00; System.out.println(jeroensFormat(moneyWithDecimals)); System.out.println(jeroensFormat(moneyNoDecimals)); 

将返回:

 € 5,- € 5,50 

实际的jeroensFormat()方法:

 public String jeroensFormat(double money)//Wants to receive value of type double { NumberFormat dutchFormat = NumberFormat.getCurrencyInstance(); money = money; String twoDecimals = dutchFormat.format(money); //Format to string if(tweeDecimalen.matches(".*[.]...[,]00$")){ String zeroDecimals = twoDecimals.substring(0, twoDecimals.length() -3); return zeroDecimals; } if(twoDecimals.endsWith(",00")){ String zeroDecimals = String.format("€ %.0f,-", money); return zeroDecimals; //Return with ,00 replaced to ,- } else{ //If endsWith != ,00 the actual twoDecimals string can be returned return twoDecimals; } } 

调用方法jeroensFormat()的方法displayJeroensFormat

  public void displayJeroensFormat()//@parameter double: { System.out.println(jeroensFormat(10.5)); //Example for two decimals System.out.println(jeroensFormat(10.95)); //Example for two decimals System.out.println(jeroensFormat(10.00)); //Example for zero decimals System.out.println(jeroensFormat(100.000)); //Example for zero decimals } 

将有以下输出:

 € 10,50 € 10,95 € 10,- € 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-) 

此代码使用您当前的货币。 在我的情况下,这是荷兰,所以格式化的string将不同于在美国的人。

  • 荷兰:999.999,99
  • 美国:999,999.99

只要看这些数字的最后3个字符。 我的代码有一个if语句来检查最后3个字符是否等于“,00”。 要在美国使用这个function,如果它不能工作的话,你可能必须把它改成“.00”。

我们通常需要做相反的事情,如果你的json货币领域是浮动的,它可能会是3.1,3.15或者3。

在这种情况下,您可能需要对其进行四舍五入以便正确显示(以及稍后可以在input字段上使用掩码):

 floatvalue = 200.0; // it may be 200, 200.3 or 200.37, BigDecimal will take care Locale locale = new Locale("en", "US"); NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale); BigDecimal valueAsBD = BigDecimal.valueOf(value); valueAsBD.setScale(2, BigDecimal.ROUND_HALF_UP); // add digits to match .00 pattern System.out.println(currencyFormatter.format(amount)); 

这就是我所做的,用一个整数来表示金额,而不是:

 public static String format(int moneyInCents) { String format; Number value; if (moneyInCents % 100 == 0) { format = "%d"; value = moneyInCents / 100; } else { format = "%.2f"; value = moneyInCents / 100.0; } return String.format(Locale.US, format, value); } 

NumberFormat.getCurrencyInstance()的问题是有时你真的想要20美元是20美元,它看起来好于20.00美元。

如果有人发现这样做的更好的方法,使用NumberFormat,我都耳朵。

这是最好的办法。

  public static String formatCurrency(String amount) { DecimalFormat formatter = new DecimalFormat("###,###,##0.00"); return formatter.format(Double.parseDouble(amount)); } 

100 – >“100.00”
100.1 – >“100.10”