2010-02-15 120 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