DecimalFormatSymbols 具有非正统语言环境的意外区域特定值
Posted
技术标签:
【中文标题】DecimalFormatSymbols 具有非正统语言环境的意外区域特定值【英文标题】:DecimalFormatSymbols has unexpected region specific values for unorthodox locales 【发布时间】:2021-03-30 12:40:14 【问题描述】:在DecimalFormatSymbols
的帮助下,您可以请求基于区域设置的特征,例如小数分隔符或千位分隔符。
只要您为常用语言标签(例如de-AT
、en-US
)请求它,它就会按预期工作。但是,如果您混合使用语言与国家/地区的组合,它的行为就会很奇怪。特别是,让我们看一下千位分隔符。 (英语是,
,德语是.
)
System.out.println("en-US: " + DecimalFormatSymbols.getInstance(Locale.US).getGroupingSeparator());
System.out.println("de-DE: " + DecimalFormatSymbols.getInstance(Locale.GERMANY).getGroupingSeparator());
System.out.println("de-US: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setLanguage("de").setRegion("US").build()).getGroupingSeparator());
System.out.println("de: "+DecimalFormatSymbols.getInstance(new Locale.Builder().setLanguage("de").build()).getGroupingSeparator());
System.out.println("DE: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setRegion("DE").build()).getGroupingSeparator());
System.out.println("ru-RU: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setLanguage("ru").setRegion("RU").build()).getGroupingSeparator());
System.out.println("RU: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setRegion("RU").build()).getGroupingSeparator());
结果是:
en-US: ,
de-DE: .
de-US: .
de: .
DE: ,
ru-RU: 0x160
RU: ,
对于de-US
,它表示一个点作为分隔符,它表示德语的分隔符,但不适用于美国。好像只考虑了语言标签。
如果我创建一个只有国家信息(缺少语言)的语言环境,似乎总是返回英文分隔符格式。
我该如何正确解决这个问题?我想要语言环境中最具体信息的格式。对于de
,我想要德国的。对于de-US
,我想要英文格式。
【问题讨论】:
【参考方案1】:与语言环境相关的信息,如DecimalFormatSymbols
,通常存储在Java 运行时库中的ResourceBundle
文件中。
阅读 javadoc 以获得完整的详细信息,但相关部分是:
资源包属于其成员共享一个通用基本名称的系列,但其名称还具有标识其语言环境的附加组件。例如,资源包系列的基本名称可能是“MyResources”。该系列应该有一个默认资源包,它与它的系列具有相同的名称 - “MyResources” - 如果不支持特定的语言环境,它将被用作最后的资源包。然后,该家族可以根据需要提供尽可能多的特定于语言环境的成员,例如名为“MyResources_de”的德国成员。
如果不同国家有不同的资源,您可以进行专门化:例如,“MyResources_de_CH”包含瑞士 (CH) 的德语 (de) 对象。如果只想修改专精中的部分资源,可以这样做。
因此,符号查找将使用 language-country
组合。如果未找到,它将尝试仅使用 language
。否则它将使用具有默认值的基本文件。
getGroupingSeparator
的默认值是 ,
,因此这是您在不受支持的语言环境(例如 DE
和 RU
)下获得的值。
【讨论】:
感谢您的澄清。由于您的帮助,我发现这些可用设置位于/jdk-installation/jre/lib/ext/localedata.jar
。许多语言环境都有资源包 java 类,它们静态地提供不同的语言环境特定信息。稍后会检查 NumberElements
键,以便提供此分组分隔符。我现在要做的就是在那些复杂的 java 数据结构中添加缺失的语言环境。以上是关于DecimalFormatSymbols 具有非正统语言环境的意外区域特定值的主要内容,如果未能解决你的问题,请参考以下文章