Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NumberFormat Java的奇怪行为_Java_Validation_Parsing_Number Formatting - Fatal编程技术网

NumberFormat Java的奇怪行为

NumberFormat Java的奇怪行为,java,validation,parsing,number-formatting,Java,Validation,Parsing,Number Formatting,我有以下代码来解析名为str的字符串变量 NumberFormat formatter = NumberFormat.getInstance(); Number number = formatter.parse(str); 我想捕捉当str不是数字时抛出的异常,只是为了验证它。我的问题是它并不总是抛出预期的ParseException。当字符串str以数字开头,然后是字符时,它似乎会从字符串的第一个字符中获取一个字符串,并将其解析为一个数字 例如: 如果str=“a10”,则会引发Parse

我有以下代码来解析名为str的字符串变量

NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
我想捕捉当str不是数字时抛出的异常,只是为了验证它。我的问题是它并不总是抛出预期的ParseException。当字符串str以数字开头,然后是字符时,它似乎会从字符串的第一个字符中获取一个字符串,并将其解析为一个数字

例如:

  • 如果str=“a10”,则会引发ParseException
  • 如果str=“10a”,则不会引发异常,并且number=10
我不能使用Double.parseDouble(str),因为str可以有逗号和像1000.98这样的点,这种格式不被这个方法理解

为什么会这样?我可以用其他方式验证它吗? 谢谢

如果你看一下,它清楚地说:

从文本的开头解析文本 给定字符串以生成一个数字。这个 方法不能使用 给定的字符串


如果您想查看解析器解析的距离,可以使用。这样你可以检查你是否有任何拖尾字符。您还可以使用例如通用langs来检查整个字符串中的字母数字字符。

这种行为并不奇怪,它是按设计的

从给定字符串的开头解析文本以生成数字。该方法不能使用给定字符串的整个文本

您可以像这样使用位置感知解析方法:

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();
} 

抱歉,Sfussenger,在我使用位置感知方法更新之前,没有看到你的帖子。@很可能是因为你比我快,所以拒绝;)我不是说NumberFormat的行为是错误的,但我误解了API。我认为位置是指示我要解析字符串的字符。现在我明白了为什么它是这样设计的。谢谢您的回答。对我很有用:如果您在需要整数时发现浮点,请使用
setParseIntegerOnly(true)
引发异常