DecimalFormatSymbols 具有非正统语言环境的意外区域特定值

Posted

技术标签:

【中文标题】DecimalFormatSymbols 具有非正统语言环境的意外区域特定值【英文标题】:DecimalFormatSymbols has unexpected region specific values for unorthodox locales 【发布时间】:2021-03-30 12:40:14 【问题描述】:

DecimalFormatSymbols 的帮助下,您可以请求基于区域设置的特征,例如小数分隔符或千位分隔符。

只要您为常用语言标签(例如de-ATen-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 的默认值是 ,,因此这是您在不受支持的语言环境(例如 DERU)下获得的值。

【讨论】:

感谢您的澄清。由于您的帮助,我发现这些可用设置位于/jdk-installation/jre/lib/ext/localedata.jar。许多语言环境都有资源包 java 类,它们静态地提供不同的语言环境特定信息。稍后会检查 NumberElements 键,以便提供此分组分隔符。我现在要做的就是在那些复杂的 java 数据结构中添加缺失的语言环境。

以上是关于DecimalFormatSymbols 具有非正统语言环境的意外区域特定值的主要内容,如果未能解决你的问题,请参考以下文章

【数据分析】b站非正式会谈第六季

Object-C非正式协议与正式协议的区别

快速实现兼容的js复制方式。有点非正规,通过非正规的排版实现。

非正式谬误导致堆栈溢出

myeclipse非正常关闭引起的异常解决办法

非正常情况下的移动加权平均算法