2014-07-07 21 views
21

這個問題似乎非常簡單,但我很尷尬地說我還沒有弄清楚它是如何工作的。從操作系統獲取數字格式

我希望我的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。沒有幫助。

我在做什麼錯?

+0

Look [here](http://stackoverflow.com/questions/838590/how-to-read-list-separator-from-os-in-java) – Jens

+0

看來你需要從註冊表,如果你需要它。 –

+0

@Jarrod他們似乎沒有詢問有關'Locale'的格式。 –

回答

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

您需要查看:how to detect operating system language (locale) from java code。看起來這個錯誤是在Java 7早期版本中引入的,稍後在Java 7中有所修復。

爲了測試,我將Window 7 Region設置爲「法國法國」。 (你一樣顯示在您的屏幕截圖。)

運行此代碼:

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 = EN

小數分隔爲:,

所以只有小數點分隔符在Java 7中是正確的。一個可能的差異 - 是我沒有將我的「系統區域設置」從英語(美國)更改爲法語(法國),因爲它需要重新啓動。所以也許這可能會影響Java 7爲Locale和user.language值顯示的內容。

+0

謝謝,但這裏的問題是如何讓Java在上面截圖的右側圖片中識別自定義設置(由用戶做出的選擇)。問題在於Java--與Windows或KDE等各種用戶界面不同 - 將所有內容鏈接到語言環境。我想大約30年前這是一個很好的設計選擇。現在,隨着全球化,終端用戶不再覺得他們的地區選擇和他們選擇的說號碼格式化之間(必然)有任何直接聯繫。 Java的模型有缺陷。它屬於另一個時代。 Windows,KDE和OSX正確地執行它。 – peterh