2011-11-27 31 views
4

我試圖加載信息從屬性文件,我有以下代碼:parseDouble在Java的結果NumberFormatException的

anInt = Integer.parseInt(prop.getProperty("anInt")); 
aDouble = Double.parseDouble(prop.getProperty("aDouble")); 

,並在第一線工作得很好,第二個在那裏我試圖 加載一個雙變量會拋出一個NumberFormatException。具體的異常消息是:

Exception in thread "main" java.lang.NumberFormatException: For input string: "78,5" 
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222) 
at java.lang.Double.parseDouble(Double.java:510) 
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:59) 
at Assignment1.BaseStation.main(BaseStation.java:83) 
+6

prop.getProperty(「aDouble」)的價值是什麼? –

+0

它就像是56,5 – nikos

+0

它必須是一個**。**不是**,**。 –

回答

17

你必須使用一個句點作爲分隔符,如果你想使用Double.parseDouble()解析沒有逗號。它在Double類的文檔中說,

FloatingPointLiteral ... [是]在Java語言規範的詞彙結構部分定義的。

從Java語言規範:

FloatingPointLiteral:

  • 位數。數字選擇 ExponentPart 選擇 FloatTypeSuffix 選擇
  • 。數字ExponentPart 選擇 FloatTypeSuffix 選擇
  • 數字ExponentPart FloatTypeSuffix 選擇
  • 數字ExponentPart 選擇 FloatTypeSuffix

如果你想現場考慮,可以使用java.text.NumberFormat

NumberFormat nf = NumberFormat.getInstance(); 
double number = nf.parse(myString).doubleValue(); 
+0

不!這是本地化的依賴。 –

+0

Double.parseDouble()使用Java語言中的定義。 Java中的浮點文字必須使用句點,而不是逗號。 – Malcolm

+0

氣墊船是正確的 - 如果您關心本地化設置,則使用逗號作爲分隔符的值將被正確解析。 – mort

3

「。」通常用作逗號分隔符。如果您想堅持使用「,」您必須更改本地化設置:

Locale.setDefault(Locale.GERMAN); //German will do the trick, better to use your country code 

或使用'NumberFormat'類。這是很好解釋int this stackover flow thread

+1

一個警告,如果你改變Locale.setDefault()它會影響整個JVM。然後,如果您使用像servlet容器這樣的容器,則必須注意您的應用程序(與本地化有關的代碼)和其他應用程序。 –

+0

的確如此,最好使用'NumberFormat'。 – mort

+4

-1:'Locale.setDefault()'不會影響'Double.parseDouble()',因爲它不考慮語言環境。我在我的答案中引用了文檔,從OpenJDK源代碼中很明顯,我也在我的機器上檢查過它。 – Malcolm

4

如果你想使用「,」作爲一些歐盟國家使用。你必須仔細照顧你的本地化。

瞭解Java API http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html

在的valueOf,它說

To interpret localized string representations of a floating-point value, use subclasses of NumberFormat. 

例如,該代碼將解決您的問題,

NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN); 
double number = nf.parse(myString).doubleValue(); 

一個重要的事情,你必須不使用類似

Locale.setDefault(something); 

因爲它會影響整個JVM。換句話說,這意味着它可能會影響使用本地化的其他代碼。此外,如果您正在使用容器(如Servlet容器)(如共享Tomcat託管),則它可能會影響同一JVM中的其他應用程序。

大多數情況下,類似Locale.setDefault()的東西可以在您的本地計算機中使用,但是您不能將其部署到其他服務器(共享Tomcat主機)上,因爲它們的JRE可能被設置爲不允許做這樣的方法。我很肯定,大多數優秀的託管服務提供商都這樣做。如果您可以在任何託管服務提供商的任何共享Tomcats上部署此類代碼,我強烈建議您更換爲其他託管公司。