从OS获取数字格式

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

我希望我的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()); } } 

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

 Decimal separator is : , Thousands separator is : . 

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

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

我究竟做错了什么?

我自己找到了答案。

从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应用程序-Djava.locale.providers=HOST,....因为这将使我的Java应用程序在同一主机上的行为与本机应用程序相同。

我在JDK8 javadocs中找到了答案。 Java 8增强function文档中还有一些关于它的注释 。

您需要看到: 如何从java代码中检测操作系统语言(语言环境) 。 看起来这个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值显示的内容。