从货币格式中删除国家/地区代码的惯用方法?

O.m*_*O.m 6 java currency internationalization cldr java-17

Java 11 和 17 之间的货币格式更改为:

\n
NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH).format(100.00)\n
Run Code Online (Sandbox Code Playgroud)\n

将打印100,00\xc2\xa0$\xc2\xa0CA而不是100,00\xc2\xa0$.

\n

还有比这更好的方法来删除国家代码吗CA

\n
var currencyFormat = NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH);\nif (currencyFormat instanceof DecimalFormat decimalFormat) {\n    var symbols = DecimalFormatSymbols.getInstance(Locale.CANADA_FRENCH);\n    symbols.setCurrencySymbol("$");\n    decimalFormat.setDecimalFormatSymbols(symbols);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

只是为了恢复直到最近为止的默认行为似乎有点太多了。

\n

Did*_*r L 7

我对此进行了深入研究,默认情况下, JDK 语言环境数据来自Unicode CLDR ,并且似乎它们在 8 月份恢复到了之前,请参阅$ CACLDR -14862此提交(展开然后转到第 5914/5923 行)。$common/main/fr_CA.xml

这是 10 月份发布的 v40 的一部分,对于 JDK 17 来说太晚了,JDK 17的文档说它使用 CLDR v35.1在 Java 13 中引入),但似乎在 2021 年 4 月更新到了 v39他们忘记了发行说明 (JDK 16 似乎已经升级到 v38)。

CLDR v40计划用于 JDK 19

COMPAT您可能希望首先使用区域设置运行您的应用程序,

-Djava.locale.providers=COMPAT,CLDR,SPI
Run Code Online (Sandbox Code Playgroud)

在这里找到,但另请参阅LocaleServiceProvider

这将使用与 Java 8 兼容的区域设置,而该区域设置不存在此问题。