Java 8 不渲染货币符号

Java 8 does not render currency symbol

我在 Java 8 中发现了一个奇怪的情况。我打算将数字格式化为特定的语言环境,但其中一些无法正常工作。

long tenMillion = 10000000L; // this is ten million
Locale[] locales = Locale.getAvailableLocales();
//Locale[] locales = NumberFormat.getAvailableLocales(); // the same situation
for (Locale locale : locales) {
String currency = "Ten million in " + locale.getDisplayName() + "  is " +
                NumberFormat.getCurrencyInstance(locale).format(tenMillion);
    if (locale.getDisplayName().equals("Ukrainian")){
        System.out.println(currency);
        System.out.println(Currency.getInstance("UAH").getSymbol(locale));
    }
}

输出

Ten million in Ukrainian  is ¤ 10 000 000,00
UAH

但是当我创建这个定位的实例时,我得到了正确的结果:

Locale uaLoc = new Locale("uk", "UA");
String currency = "Ten million in " + uaLoc.getDisplayName() + "  is " +
        NumberFormat.getCurrencyInstance(uaLoc).format(tenMillion);
System.out.println(currency);
System.out.println(Currency.getInstance("UAH").getSymbol(uaLoc));

输出

Ten million in Ukrainian (Ukraine)  is 10 000 000 грн.
грн.

这不仅适用于乌克兰语言环境,也适用于其他语言环境:

Ten million in Bulgarian  is ¤ 10 000 000,00
Ten million in Italian  is ¤ 10.000.000,00
Ten million in Korean  is ¤ 10,000,000.00
Ten million in Latvian  is ¤ 10 000 000,00
etc.

但国家/地区格式正确的语言环境:

Ten million in Bulgarian (Bulgaria)  is лв.10 000 000
Ten million in Italian (Italy)  is € 10.000.000,00
Ten million in Italian (Switzerland)  is SFr. 10'000'000.00
Ten million in Korean (South Korea)  is ₩10,000,000
Ten million in Latvian (Latvia)  is 10 000 000 €

货币似乎只与国家有关。而且这个方法非常正确!

有谁知道如何为 Java 9 请求 API 更改? 如果能关注 API

就好了
Locale.getAvailableCountryLocales(); 

为了避免误会。

谢谢

Locale.getAvailableLocales() returns 语言环境列表,

  • 只指定语言,不指定国家
  • 或指定语言和国家。

示例:

it, : Italian
it, CH: Italian (Switzerland)
it, IT: Italian (Italy)

在我的安装中,我看到了两个 ucrainian 语言环境,一个对应于 Locale("uk"),一个对应于 Locale("uk", "UA")

一般来说,每个纯语言区域设置都伴随着一种或多种语言+国家/地区的区域设置。

如果您将条件更改为

 if (locale.getDisplayName().startsWith("Ukrainian")){

您还会看到两个 ucrainian 条目,其中一个显示您想要的结果。

回答您的实际问题: 以下是该过程的概述:http://openjdk.java.net/jeps/1 您基本上需要填写表格并通过电子邮件发送(地址包含在文章中),并希望有足够多的人与您有相同的要求。 (不知道能不能满足'two weeks of engineering work'的要求

如果您愿意,也可以作为 JCP Public 参与,允许您评论和讨论现有提案,如果您通过签署 Java 规范参与协议(更多信息:参见 link to JSPA-pdf following next url)。

从这里开始:https://jcp.org/en/participation/overview

我发现了一种棘手的方法来获取仅包含国家/地区的所有可用语言环境。 Into java 8 添加了新的静态方法过滤器

filter(List<LanguageRange> priorityList,Collection<Locale> locales)

此方法是实现 RFC 4647 的一部分

List<Locale.LanguageRange> list1 = new ArrayList<>();
list1.add(new Locale.LanguageRange("*-*"));
// Locales
List<Locale> list3 = Locale.filter(list1,Arrays.asList(Locale.getAvailableLocales()));
list3.forEach(System.out::println);

输出:

ar_AE
ar_JO
ar_SY
hr_HR
fr_BE
es_PA
mt_MT
es_VE
zh_TW
da_DK
es_PR
vi_VN
en_US
etc.

这不是最好的方法,但它是某种东西。