2010-02-15 92 views
6

我有下面的代碼來解析一個名爲str的字符串變量。NumberFormat的奇怪行爲Java

NumberFormat formatter = NumberFormat.getInstance(); 
Number number = formatter.parse(str); 

我想捕捉異常拋出時,不是一個數字只是爲了驗證它。我遇到的問題是它並不總是拋出預期的ParseException。當字符串str以數字開頭,但後面是字符時,它似乎會得到字符串的第一個字符並將它們解析爲數字。

例如:

  • 如果str = 「A10」 隨後被拋出一個ParseException
  • 如果str = 「10A」,則沒有異常拋出和數量= 10

我不能使用Double.parseDouble(str)是因爲str可以包含逗號和點數如1,000.98,並且此格式不能被此方法理解。

這是怎麼發生的?我可以用其他方式驗證它嗎? 感謝

+1

我不是那個意思的NumberFormat的行爲是錯誤的,但我誤解了API。我認爲職位是要表明我想解析字符串的人物。現在我明白爲什麼這樣設計了。感謝您的所有支持。 – Javi 2010-02-15 13:47:35

回答

6

的行爲並不陌生,它是從給定的字符串,產生了許多的設計之初

分析文本。該方法可能不會使用給定字符串的整個文本。

您可以使用位置感知分析方法是這樣的:

public static double parse(String str) throws ParseException { 
    NumberFormat formatter = NumberFormat.getInstance(); 
    ParsePosition position = new ParsePosition(0); 
    Number number = formatter.parse(str, position); 
    if (position.getIndex() != str.length()) { 
    throw new ParseException("failed to parse entire string: " + str, position.getIndex()); 
    } 
    return number.doubleValue(); 
} 
+0

對我有用:如果在期待Integer時發現Float,則使用'setParseIntegerOnly(true)'拋出異常 – xdola 2017-05-11 21:43:09

6

如果你看看API,上面清清楚楚地寫着:

從 給字串的生產數量的開始解析文本,。 方法可能不會使用給定字符串的整個文本 。

如果您想查看解析器分析的距離,可以使用other position-aware method。這樣你可以檢查你是否有任何拖尾字符。您也可以使用例如common langs isAlpha檢查整個字符串中的字母數字字符。

+0

對不起sfussenegger,在我更新了位置感知方法之前沒有看到您的帖子。 – 2010-02-15 13:08:11

+0

@disown最有可能是因爲你比我快;) – sfussenegger 2010-02-15 13:32:23