在 Java 中设置外语区域设置货币的格式

2022-09-01 00:48:39

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

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


答案 1

尝试在 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 美元


答案 2

我会从les2 https://stackoverflow.com/a/7828512/1536382 中补充答案,我相信分数位数不是从货币中获取的,它必须手动设置,否则如果客户端(NumberFormat)具有日本区域设置并且货币是欧元或en_US,则金额显示为“a la”Yen“,没有分数数字,但这并不像预期的那样,因为在欧元小数中是相关的, 也适用于日语;-)。

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

    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 更改时,不会执行此操作