2016-08-24 54 views
-1

此錯誤可能是由於我的系統區域設置不同所致。我使用DOT作爲小數點分隔符。解析float時String的NumberFormatException

我試圖設置一個默認的語言環境,當我的應用程序啓動時,但我得到相同的異常。

Locale.setDefault(Locale.US); 

堆棧跟蹤:

Caused by: java.lang.NumberFormatException: For input string: "6,2" at 
sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) at 
sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122) at 
java.lang.Float.parseFloat(Float.java:451) 
+4

'我使用DOT爲十進制separator' ....'NumberFormatException的:對於輸入字符串: 「6,2」'。這裏聽起來沒有什麼。 – SomeJavaGuy

+0

我很確定美國也使用點 –

+1

您需要設置爲使用逗號而不是點(例如德語)的語言環境。但是,比設置默認語言環境(其將在各個應用程序範圍內具有各種效果)更好,請將其設置在NumberFormatter實例上。 – Thilo

回答

3

它看起來像你的代碼是使用Float.parseFloat。這不使用任何區域設置。從該文檔:

返回初始化由指定String,表示爲由Float類的valueOf方法中執行的值的新的浮動。

而且valueOf都有詳細的語法,這包括:

要解釋浮點值的本地化字符串表示的NumberFormat使用子類。

所以基本上,你的默認語言環境在這裏是不相關的。如果你想解析「6,2」,你應該使用NumberFormat和一個使用逗號作爲小數點分隔符的語言環境。

+0

我得到:'不能格式化給定的對象作爲數字' 這是我的方法: 'NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);' 'course.setCourseGrade(Float.parseFloat (format.format(courseGrade)));' – pror21

+1

@ pror21所以你把一個'float'轉換成'String'使用'NumberFormat'然後解析回''float'沒有locale?這裏有什麼讓你覺得奇怪嗎? –

+0

@ pror21:你還沒有解釋你真正想達到的目標。我已經解釋了這個問題中的行爲,但上面的註釋似乎並沒有與它緊密相關...... –

0

什麼,我終於使用此代碼波紋管:

DecimalFormatSymbols symbols = new DecimalFormatSymbols(); 
    symbols.setDecimalSeparator('.'); 
    DecimalFormat format = new DecimalFormat("0.#"); 
    format.setDecimalFormatSymbols(symbols); 

    try { 
     course.setCourseGrade(format.parse(courseGrade).floatValue()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
相關問題