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)。
我发现了一种棘手的方法来获取仅包含国家/地区的所有可用语言环境。 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.
这不是最好的方法,但它是某种东西。
我在 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)。
我发现了一种棘手的方法来获取仅包含国家/地区的所有可用语言环境。 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.
这不是最好的方法,但它是某种东西。