O.m*_*O.m 6 java currency internationalization cldr java-17
Java 11 和 17 之间的货币格式更改为:
\nNumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH).format(100.00)\nRun Code Online (Sandbox Code Playgroud)\n将打印100,00\xc2\xa0$\xc2\xa0CA而不是100,00\xc2\xa0$.
还有比这更好的方法来删除国家代码吗CA?
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}\nRun Code Online (Sandbox Code Playgroud)\n只是为了恢复直到最近为止的默认行为似乎有点太多了。
\n我对此进行了深入研究,默认情况下, 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 兼容的区域设置,而该区域设置不存在此问题。