这个问题似乎非常简单,但我很尴尬地说我还没有弄清楚它是如何运作的。
我希望我的Java SE应用程序从操作系统中配置的任何内容中获取其数字格式。就像该操作系统上的任何其他应用程序一样。
我的目标主要是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。没有帮助。
我做错了什么?
答案 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值显示的内容。