【问题标题】:Java 8 does not render currency symbolJava 8 不呈现货币符号
【发布时间】:2016-03-01 15:30:09
【问题描述】:

我在 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

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

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(); 

为了避免任何误解。

谢谢

【问题讨论】:

  • 好吧,如果你只输入语言,没有关于国家的具体信息,对吧?例如,如果您选择英语作为语言,货币显示将根据国家/地区是美国还是英国而有所不同......虽然我不确定,但我的猜测是只有当除了语言之外,还指定了国家/地区是能够显示正确货币表示的语言环境实现。例如,法语也是如此,具体取决于国家是法国还是加拿大。
  • 我想知道你的第一个代码 sn-p 中的 uaLoc 是什么...
  • @Tom 感谢您的评论。那是“语言环境”。已编辑
  • @zapl 谢谢,这对我来说是新信息

标签: java locale currency symbols


【解决方案1】:

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

如果您愿意,您还可以作为 JCP Public 参与,允许您评论和讨论现有提案,如果您通过签署 Java 规范参与协议成为 JCP 成员,甚至可以添加新提案(更多信息:请参阅下一个 url 后面的 JSPA-pdf 链接)。

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

【讨论】:

  • 感谢您提供有用的链接,将尝试选择这个主题。
【解决方案2】:

我发现了一种棘手的方法,即如何仅获取国家/地区的所有可用语言环境。在 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.

这不是最好的方法,但它确实是。

【讨论】:

    【解决方案3】:

    Locale.getAvailableLocales() 返回一个区域设置列表,其中一个

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

    例子:

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

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

    一般来说,每种纯语言语言环境都伴随着一种或多种语言+国家/地区语言环境。

    如果您将条件更改为

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

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

    【讨论】:

    • 是的,我在stackoverflow中写问题时已经理解了。此外,如果有新的 api 方法将只返回指定国家/地区的所有语言环境,那就太好了。
    • @Garbachov 是的,Locale API 不是最优的,如果您可以提交请求以改进 Locales 的查找,那就太好了。
    • Locale.getISOCountries() 将获得国家代码,new Locale("", "UA", "") 就足够了。
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2017-06-22
    • 2017-06-13
    • 2012-08-12
    相关资源
    最近更新 更多