2012-09-24 69 views
12

您好,我无法将长(美分)转换为货币格式。Java将长转换为货币

我的代码:

long doublePayment = 1099; //Should equal $10.99 
DecimalFormat dFormat = new DecimalFormat(); 
String formattedString = dFormat.format(doublePayment); 
System.out.println(formattedString); 

输出:1099

我也试过:

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

由于这是仙,输出应为10.99或10.99 $。

无法弄清楚我做错了什么。谢谢!!!

+0

糟糕抱歉,我不知道为什么我的代码没有进入“CodeFormat”,所以提前抱歉。 – mcd

+0

因为你需要在代码之前换行符;我为你修好了。 – Jesper

+1

仅供参考,你应该使用BigDecimal货币:http://stackoverflow.com/questions/285680/representing-monetary-values-in-java – wulfgarpro

回答

18

分钱转换成美元,你可以使用

long doublePayment = 1099; 
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment/100.0); 
System.out.println(s); 

这将是精确到700000亿$。

+0

感谢您的帮助 – mcd

+0

我已经尝试了我以前的想法,但把“x/100”甚至不认为它不同于“x/100.0” – mcd

+1

是的,整数除以整数给出一个整数。它应该给你一个真正的你可以投到一个整数整数除法,但你至少需要双/整数或整数/双重获得一个双。 –

0

double doublePayment = 10.99;您需要提供这样的货币。 NumberFormat不会了解您是否以美分或$提供它,除非它看到小数点

0

这不是格式问题,这是输入问题。将你的输入分为100,你就会全部设置。

float payment = 1099/((float) 100); 
+0

我会使用double而不是float,因为会有更少的表示错误。即'双重付款= 1099/100.0;' –

0

使用的货币格式化:

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.ENGLISH); 
String output = nf.format(value); 
System.out.println(value + " " + output); 
6

你的文字是1099,这是千和99,与Java规则整数文字应对。根据您的JVM区域设置,此编号用1,099表示。如果你在欧洲,那将是1.099。所以,输出不是问题,而是输入

问题是你必须代表一个定点值,但你不知道java.math.BigDecimal并试图伪造它。当你做一些计算时,事情就会破坏。不要这样做。

这就是你应该做的。简单(它远远更少的代码,太):

BigDecimal payment = new BigDecimal("10.99"); 
System.out.println(String.format("$%.2f", payment)); 

注意你如何真正initailize一个字符串。此外,String.format()将照顾of the current locale,或者您可以通过重载方法提供所需的信息。

+3

可能的情况是,大卫有很长的美分价值,那么他应该使用新的BigDecimal(doublePayment).movePointLeft(2); – Lauri

22

如果你有很长的开始,你仍然应该使用java.math.BigDecimal。

long doublePayment = 1099; 
    BigDecimal payment = new BigDecimal(doublePayment).movePointLeft(2); 
    System.out.println("$" + payment); // produces: $10.99 

让这段话再次大声说:一个人永远不能使用浮点变量来存储钱/货币价值。

+1

除大多数投资银行使用'double'外。 C或C++中没有BigDecimal,但很多系统使用C或C++。 ;) –

+3

我会假设,银行确实使用一些整数或长整数来存储美分或美分的分数,因为浮点算术确实会产生较小的错误,这在银行系统中是不允许的。 – Lauri

+2

小错误不是随机错误。您可以预测它们的大小,并使用适当的四舍五入。你是对的,int也可以使用,但是这些并不常见,恕我直言。我同意,如果你不知道如何使用适当的舍入,那么使用BigDecimal。 –