Java长期转换为货币

时间:2012-09-24 07:33:04

标签: java currency long-integer number-formatting

我无法将长(美分)转换成货币格式。

我的代码:

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

输出:1,099

我也尝试过:

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

由于这是美分,输出应为10.99或10.99美元。

不能弄清楚我做错了什么。感谢!!!

7 个答案:

答案 0 :(得分:28)

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

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

让它再次大声说出:永远不应该使用浮点变量来存储货币/货币价值。

答案 1 :(得分:22)

要将美分兑换成美元,您可以使用

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

这将准确高达70万亿美元。

答案 2 :(得分:7)

你的文字是1099一千九百九十九,处理整数文字的Java规则。根据您的JVM语言环境,此数字用1,099表示。如果你在欧洲,那就是1.099。因此,输出不是问题,而是使用输入

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

这是你应该做的。简单(它的代码也少得多):

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

请注意您如何使用字符串真正启动号码。另外,String.format()会谨慎of the current locale,或者您可以通过重载方法提供所需的一个。

答案 3 :(得分:1)

这些答案都没有考虑到不同地区的货币具有不同数量的小数位数。例如,日元的小数位数为零,而约旦第纳尔的分数为3,而美元的分数当然为2。我相信这是一个更合适的解决方案:

    long payment = 1099L;
    BigDecimal bd = new BigDecimal(payment);

    Locale jpLocale = new Locale("ja", "JP");//Japan

    Currency jpCurrency = Currency.getInstance(jpLocale);
    NumberFormat jpnf = NumberFormat.getCurrencyInstance(jpLocale);
    int jpNumFractionalDigits = jpCurrency.getDefaultFractionDigits();

    BigDecimal jpbd = bd.movePointLeft(jpNumFractionalDigits);


    Locale usLocale = new Locale("en", "US");//United States

    Currency usCurrency = Currency.getInstance(usLocale);
    NumberFormat usnf = NumberFormat.getCurrencyInstance(usLocale);
    int usNumFractionalDigits = usCurrency.getDefaultFractionDigits();

    BigDecimal usbd = bd.movePointLeft(usNumFractionalDigits);



    System.out.println(jpnf.format(jpbd)); //prints ¥1,099
    System.out.println(usnf.format(usbd));//prints $10.99

答案 4 :(得分:0)

double doublePayment = 10.99;您需要提供这样的货币。 NumberFormat无法理解您是以美分还是以美元提供,除非它看到小数点

答案 5 :(得分:0)

格式化不是问题,输入问题。将你的输入除以100就可以了。

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

答案 6 :(得分:0)

使用货币格式化程序:

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