从OS获取数字格式

pet*_*erh 22 java

这个问题似乎非常简单,但我很尴尬地说我无法弄清楚它是如何工作的.

我希望我的Java SE应用程序从操作系统中配置的任何内容中获取其数字格式.就像该OS上的任何其他应用程序一样.

我的目标主要是Windows.在Windows中考虑此示例:

在此输入图像描述

我用这个小例子来检查结果:

public class MyMain {
    public static void main(String[] args) {
        DecimalFormat decFormat = new DecimalFormat();
        DecimalFormatSymbols decSymbols = decFormat.getDecimalFormatSymbols();           
        System.out.println("Decimal separator is : " + decSymbols.getDecimalSeparator());
        System.out.println("Thousands separator is : " + decSymbols.getGroupingSeparator());
    }
}
Run Code Online (Sandbox Code Playgroud)

通过上面的截图示例,我的小Java示例打印:

Decimal separator is : ,
Thousands separator is : .
Run Code Online (Sandbox Code Playgroud)

我原以为它会说小数点分隔符是一个点而千位分隔符是一个逗号 - 因为这就是我告诉Windows的内容,而这正是所有其他Windows应用程序所接受的.

我的印象是,在Windows中,这些设置会对新进程生效.我试过重启我的IDE.没有帮助.

我究竟做错了什么?

pet*_*erh 15

我自己找到了答案.

从JDK8开始,您可以要求Java在解决与语言环境相关的内容时将主机设置作为您的首要任务.

我稍微扩展了我的例子:

public class MyMain {
    public static void main(String[] args) {
        DecimalFormat decFormat = new DecimalFormat();
        DecimalFormatSymbols decSymbols = decFormat.getDecimalFormatSymbols();
        String localeProvidersList = System.getProperty("java.locale.providers", "JRE,SPI");
        System.out.println("Decimal separator is : " + decSymbols.getDecimalSeparator());
        System.out.println("Thousands separator is : " + decSymbols.getGroupingSeparator());
        System.out.println("Locale providers list : " + localeProvidersList);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行上面我举的例子 -Djava.locale.providers=HOST,JRE,SPI给:

Decimal separator is : .
Thousands separator is : ,
Locale providers list : HOST,JRE,SPI
Run Code Online (Sandbox Code Playgroud)

没有 java.locale.providers定义的运行给出:

Decimal separator is : ,
Thousands separator is : .
Locale providers list : JRE,SPI
Run Code Online (Sandbox Code Playgroud)

我个人总是运行我的Java应用程序,-Djava.locale.providers=HOST,....因为这将使我的Java应用程序在同一主机上的行为与本机应用程序相同.

在JDK8 javadocs内部找到了答案.Java 8增强功能文档中还有一些关于它的注释.