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

问题描述

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,我想要英文格式。

解决方法

与区域设置相关的信息,例如 DecimalFormatSymbols,通常存储在 Java 运行时库中的 ResourceBundle 文件中。

阅读 javadoc 了解完整细节,但相关部分是:

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

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...