19

我无法将 long(美分)转换为货币格式。

我的代码:

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 美元。

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

4

7 回答 7

38

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

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

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

于 2012-09-24T08:07:06.663 回答
27

要将美分转换为美元,您可以使用

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

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

于 2012-09-24T08:11:55.840 回答
10

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

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

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

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

请注意您如何真正使用String初始化数字。此外,将处理当前的 locale,或者您可以通过重载方法提供所需的语言环境。String.format()

于 2012-09-24T07:51:30.920 回答
5

这些答案都没有考虑到不同地区的货币具有不同的小数位数。例如,日元的小数位数为零,约旦第纳尔的小数位数为 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
于 2019-01-26T04:23:51.207 回答
2

这不是格式的问题,而是输入的问题。将您的输入除以 100,一切就绪。

float payment = 1099 / ((float) 100);
于 2012-09-24T07:42:25.193 回答
0

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

于 2012-09-24T07:41:49.157 回答
0

使用货币格式化程序:

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.ENGLISH);
String output = nf.format(value);
System.out.println(value + " " + output);
于 2012-09-24T07:43:44.857 回答