在 Java 中格式化外国语言环境中的货币

新手上路,请多包涵

我正在尽我所能找到一种方法来使用 Java 跨各种区域设置外币的格式,这些区域设置不是该货币的默认设置。我找到了 java.util.Currency,它可以表示用于各种语言环境的正确符号。也就是说,对于美元,它在美国为我提供了符号 $,在其他国家为我提供了美元或美元。此外,我还找到了 java.text.NumberFormat,它将为特定区域设置货币格式。我的问题 - util.Currency 将提供适当的符号和代码来表示非默认语言环境中的货币,但不会以任何特定于语言环境的方式格式化货币。 NumberFormat 假定我传递给它的带有区域设置的数字是该 区域设置的货币, 而不是外币。

例如,如果我使用 getCurrencyInstance(Locale.GERMANY) 然后格式化 (1000),它假定我正在格式化 1000 欧元。实际上,我可能需要美元、日元或任何其他货币的正确的德语本地化表示(正确的小数点和千位分隔符,是将符号放在金额之前还是之后)。到目前为止,我所能得出的最好结果是使用 NumberFormat 格式化数字,然后在输出中搜索非数字字符,并将它们替换为从 util.Currency 派生的符号。然而,这是非常脆弱的,并且对于我的目的来说可能不够可靠。想法?任何帮助深表感谢。

原文由 JPittard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 665
2 个回答

尝试在 getCurrencyInstance(Locale.GERMANY) 返回的实例上使用 setCurrency

坏了

 java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
System.out.println(format.format(23));

输出:23,00 €

固定

 java.util.Currency usd = java.util.Currency.getInstance("USD");
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY);
format.setCurrency(usd);
System.out.println(format.format(23));

输出:23,00 美元

原文由 les2 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想从 les2 https://stackoverflow.com/a/7828512/1536382 回答我相信小数位数不是从货币中获取的,它必须手动设置,否则如果客户端(NumberFormat)有日本语言环境并且货币是 EURO 或 en_US,那么金额显示为“a la’ Yen’,没有小数位,但这并不像预期的那样,因为在欧元中小数点是相关的,对于日语也是如此 ;-)。

因此 les2 示例可以通过添加 format.setMaximumFractionDigits(usd.getDefaultFractionDigits()); 得到改进,在该示例的特定情况下不相关,但使用带小数的数字和 Locale.JAPAN 作为 NumberFormat 的区域设置变得相关。

     java.util.Currency usd = java.util.Currency.getInstance("USD");
    java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(
          java.util.Locale.JAPAN);
    format.setCurrency(usd);
    System.out.println(format.format(23.23));
    format.setMaximumFractionDigits(usd.getDefaultFractionDigits());
    System.out.println(format.format(23.23));

将输出:

 USD23
USD23.23

NumberFormat 代码 中,对格式的初始/默认货币做了类似的事情,调用方法 DecimalFormat#adjustForCurrencyDefaultFractionDigits 。之后使用 NumberFormat.setCurrency 更改货币时不会执行此操作

原文由 Testo Testini 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题