wit*_*ich 4 java locale number-formatting cldr java-11
当我通过 输出数字时,如何在JAVA 11中使用不受支持的区域设置(例如ar-US
)?String.format()
在Java 8中,这工作得很好(尝试jdoodle,选择 JDK 1.8.0_66):
\nLocale locale = Locale.forLanguageTag("ar-US");\nSystem.out.println(String.format(locale, "Output: %d", 120));\n// Output: 120\n
Run Code Online (Sandbox Code Playgroud)\n从Java 11开始,输出采用东方阿拉伯数字(尝试jdoodle,使用默认的 JDK 11.0.4):
\nLocale locale = Locale.forLanguageTag("ar-US");\nSystem.out.println(String.format(locale, "Output: %d", 120));\n// Output: \xd9\xa1\xd9\xa2\xd9\xa0\n
Run Code Online (Sandbox Code Playgroud)\n看来,这个问题来自于区域设置数据提供程序从JRE到CLDR的切换(来源:@mcarth 的 Java 9 中的本地化更改)。以下是支持的区域设置列表:JDK 11 支持的区域设置
\n更新
\n我将问题示例更新为ar-US
,因为我之前的示例没有意义。我们的想法是建立一种在特定国家/地区有意义的格式。在示例中,它将是美国 ( US
)。
该行为符合 CLDR 被视为首选的行为Locale
。为了确认这一点,可以使用 Java-8 执行相同的代码片段
-Djava.locale.providers=CLDR
Run Code Online (Sandbox Code Playgroud)
如果您退一步查看JEP 252:默认使用 CLDR 区域设置数据,详细信息如下:
默认查找顺序为 CLDR、COMPAT、SPI,其中 COMPAT 指定 JDK 9 中 JRE 的区域设置数据。如果特定提供程序无法提供所请求的区域设置数据,则搜索将按顺序继续到下一个提供程序。
因此,简而言之,如果您确实不希望默认行为成为 Java-11 的默认行为,则可以使用 VM 参数更改查找顺序
-Djava.locale.providers=COMPAT,CLDR,SPI
Run Code Online (Sandbox Code Playgroud)
进一步了解如何使用 CLDR 选择正确的语言可能会有所帮助!
归档时间: |
|
查看次数: |
4191 次 |
最近记录: |