从OS获取数字格式

时间:2014-07-07 18:01:15

标签: java

这个问题似乎非常简单,但我很尴尬地说我还没有弄清楚它是如何运作的。

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

我的目标主要是Windows。在Windows中考虑这个例子:

enter image description here

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

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());
    }
}

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

Decimal separator is : ,
Thousands separator is : .

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

我认为在Windows中这些设置会对新流程生效。我尝试重新启动IDE。没有帮助。

我做错了什么?

2 个答案:

答案 0 :(得分: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);
    }
}

使用 -Djava.locale.providers=HOST,JRE,SPI上方运行我的示例,提供:

Decimal separator is : .
Thousands separator is : ,
Locale providers list : HOST,JRE,SPI

运行而不 java.locale.providers已定义:

Decimal separator is : ,
Thousands separator is : .
Locale providers list : JRE,SPI

我个人总是用-Djava.locale.providers=HOST,....运行我的Java应用程序,因为这会使我的Java应用程序在同一主机上表现得像本机应用程序一样。

我找到了答案deep inside the JDK8 javadocs。 Java 8增强功能文档中还有一个few notes

答案 1 :(得分:1)

您需要看到:how to detect operating system language (locale) from java code。看起来这个bug是在Java 7早期版本中引入的,并且在后来的Java 7中有所修复。

为了测试,我将我的Window 7 Region设置为“French France”。 (与您在屏幕截图中显示的相同。)

运行此代码:

System.out.println("default locale=" + Locale.getDefault());
System.out.println("user.language=" + System.getProperty("user.language"));
DecimalFormat decFormat = new DecimalFormat();
DecimalFormatSymbols decSymbols = decFormat.getDecimalFormatSymbols();
System.out.println("Decimal separator is : " + decSymbols.getDecimalSeparator());

使用Java 6(jdk1.6.0_45)输出:

  

默认语言环境= fr_FR

     

user.language = FR

     

小数分隔符是:,

使用Java 7(jdk1.7.0_40)输出:

  

默认locale = en_US

     

user.language = EN

     

小数分隔符是:,

因此只有小数点分隔符在Java 7中是正确的。一个可能的区别 - 我没有将我的“系统区域设置”从英语(美国)更改为法语(法国),因为它需要重新启动。因此,这可能会影响Java 7为Locale和user.language值显示的内容。