0

在您的帮助下,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我想要英文格式。

4

1 回答 1

1

与语言环境相关的信息,例如DecimalFormatSymbols,通常存储在 Java 运行时库中的ResourceBundle文件中。

阅读 javadoc 以获得完整的详细信息,但相关部分是:

资源包属于其成员共享一个通用基本名称的系列,但其名称还具有标识其语言环境的附加组件。例如,资源包系列的基本名称可能是“MyResources”。该系列应该有一个默认资源包,它与它的系列具有相同的名称 - “MyResources” -如果不支持特定的语言环境,它将被用作最后手段的包。然后,该家族可以根据需要提供尽可能多的特定于语言环境的成员,例如名为“MyResources_de”的德国成员。

如果不同国家有不同的资源,您可以进行专门化:例如,“MyResources_de_CH”包含瑞士 (CH) 的德语 (de) 对象。如果您只想修改专精中的部分资源,您可以这样做。

因此,符号查找将使用language-country组合。如果没有找到,它会尝试使用 just language。否则它将使用具有默认值的基本文件。

的默认值getGroupingSeparator,,因此这是您为不受支持的语言环境(例如DE和)获得的值RU

于 2021-03-30T13:12:38.160 回答