【问题标题】:Get number format from OS从操作系统获取数字格式
【发布时间】:2014-08-28 07:18:53
【问题描述】:

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

我希望我的 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。没有帮助。

我做错了什么?

【问题讨论】:

  • here
  • 如果需要,您似乎需要从注册表中读取此信息。
  • @Jarrod 他们似乎没有询问基于 Locale 的格式。
  • 方法是使用Locale 否则它将是特定于操作系统的。
  • 请原谅我的怀疑。我只是希望我的 Java 应用程序能够适应用户对他如何告诉他的操作系统他想要显示数字的偏好(同样可能是他对显示货币、日期或其他内容的偏好)。我需要在这里做一些特定于操作系统的破解,这根本不可能。这就是我使用 Java 的目的。

标签: java


【解决方案1】:

您需要查看:how to detect operating system language (locale) from java code。似乎该错误是在早期的 Java 7 版本中引入的,并且在后来的 Java 7 中得到了一定程度的修复。

为了进行测试,我将 Window 7 区域设置为“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) 输出:

默认语言环境=en_US

user.language=zh

小数点分隔符为:,

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

【讨论】:

  • 谢谢,但这里的问题是如何让 Java 识别上面屏幕截图右侧图片中的自定义设置(用户做出的选择)。问题是Java - 不像Windows 或KDE 等各种用户界面 - 将所有内容链接到语言环境。我想大约 30 年前这是一个合理的设计选择。现在,随着全球化,最终用户不再觉得(必然)他们选择的语言环境和他们选择的数字格式之间有任何直接联系。 Java 的模型是有缺陷的。它属于另一个时代。 Windows、KDE ​​和 OSX 都能正确完成。
【解决方案2】:

我自己找到了答案。

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

在上面运行我的示例 with -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 Enhancements 文档中还有一个 few notes 关于它。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多