这个问题似乎非常简单,但我很尴尬地说我无法弄清楚它是如何工作的.
我希望我的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增强功能文档中还有一些关于它的注释.