5

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

NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH).format(100.00)

将打印100,00 $ CA而不是100,00 $.

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

var currencyFormat = NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH);
if (currencyFormat instanceof DecimalFormat decimalFormat) {
    var symbols = DecimalFormatSymbols.getInstance(Locale.CANADA_FRENCH);
    symbols.setCurrencySymbol("$");
    decimalFormat.setDecimalFormatSymbols(symbols);
}

似乎有点多只是为了找回直到最近才默认的行为。

4

1 回答 1

2

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

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

CLDR v40计划用于 JDK 19

您可能希望COMPAT首先使用语言环境运行您的应用程序,使用

-Djava.locale.providers=COMPAT,CLDR,SPI

在此处找到但另请参阅LocaleServiceProvider

这将使用不存在此问题的与 Java 8 兼容的语言环境。

于 2022-01-30T03:21:43.923 回答