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

Idiomatic way to remove country code from currency format?

介于 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);
}

恢复直到最近才成为默认行为的东西似乎有点过头了。

我对此进行了深入研究,JDK 语言环境数据来自 Unicode CLDR by default, and it seems they reverted from $ CA to $ back in August, see CLDR-14862 and this commit(展开 common/main/fr_CA.xml,然后转到第 5914/5923 行)。

这是 10 月发布的 v40 的一部分,对 JDK 17 whose doc says it uses CLDR v35.1 来说太晚了 (这是 introduced in Java 13) 但它似乎是 2021 年 4 月 updated to v39 并且 they forgot the release note (JDK 16 似乎已经 upgraded to v38)。

CLDR v40 是 planned for JDK 19

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

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

(found here but see also LocaleServiceProvider)

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