设置阿拉伯语编号系统区域设置不显示阿拉伯数字

Eng*_*uad 9 java locale javafx arabic javafx-8

我读了这篇文章:JDK 8和JRE 8支持的语言环境,它声明:

编号系统可以由带有编号系统ID的语言标签指定 ????????????????????????????????????????????????????????????????? ? Numbering System ID ? Numbering System ? Digit Zero Value ? ????????????????????????????????????????????????????????????????? ? arab ? Arabic-Indic Digits ? \u0660 ? ?????????????????????????????????????????????????????????????????

现在,为了证明这一点,我写了以下代码:

import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;

public class Main
{
    public static void main(String[] args)
    {
        Locale locale = new Locale("ar", "sa", "arab");
        DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(locale);
        NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
        System.out.println(dfs.getZeroDigit());
        System.out.println(numberFormat.format(123));
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待输出是这样的:

0
123

但是,输出如下:

0
123

这样做的主要目的是使JavaFX GUI显示阿拉伯数字而不是英文数字,​​因为它使用默认语言环境(我可以设置它Locale.setDefault(...)).

所以我的问题是,如何使用区域设置中的编号系统来显示Java中的本地化数字?那么,是否可以在JavaFX上应用它?

Eng*_*uad 18

我做到了!仔细阅读了LocaleJavaDoc之后,我就能够生成所需的语言环境:

Locale arabicLocale = new Locale.Builder().setLanguageTag("ar-SA-u-nu-arab").build();
Run Code Online (Sandbox Code Playgroud)

这相当于:

Locale arabicLocale = new Locale.Builder().setLanguage("ar").setRegion("SA")
                   .setExtension(Locale.UNICODE_LOCALE_EXTENSION, "nu-arab").build();
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用一种称为(Unicode语言环境/语言扩展)的东西:

UTS#35,"Unicode区域设置数据标记语言"定义了可选属性和关键字,以覆盖或优化与区域设置关联的默认行为.关键字由一对键和类型表示.

使用扩展键"u"(UNICODE_LOCALE_EXTENSION)将关键字映射到BCP 47扩展值.

数字的扩展键是(nu),我使用的值是(arab).


您可以在此处查看所有扩展密钥的列表.