Java中有问题的parse()

时间:2015-10-19 08:39:31

标签: java

如果用户输入数字,则需要解析它并doSomething()。 如果用户输入数字和字符串的混合,则doSomethingElse()

所以,我在下面写了代码:

String userInput = getWhatUserEntered();
try {
   DecimalFormat decimalFormat = (DecimalFormat)     
   NumberFormat.getNumberInstance(<LocaleHere>);
   Number number = decimalFormat.parse(userInput);
   doSomething(number);    // If I reach here, I will doSomething

   return;
}
catch(Exception e)  {
  // Oh.. user has entered mixture of alpha and number
}

doSomethingElse(userInput);  // If I reach here, I will doSomethingElse
return;

函数getWhatUserEntered()看起来如下

String getWhatUserEntered()
{
  return "1923";
  //return "Oh God 1923";
  //return "1923 Oh God";
}

但是,有一个问题。

  • 当用户输入 1923 - &gt; doSomething()被点击
  • 当用户进入 Oh God 1923 - &gt; doSomethingElse()被点击
  • 当用户输入 1923年上帝时 - > doSomething()被击中。这是错误 在这里,我需要点击doSomethingElse()

我想要实现的东西是否有任何内置(更好)的功能? 我的代码可以修改以满足需求吗?

3 个答案:

答案 0 :(得分:3)

由于特定的DecimalFormat实现,一切都很好。 JavaDoc说:

  

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

所以你必须修改你的代码:

  String userInput = getWhatUserEntered();
    try {
        NumberFormat formatter = NumberFormat.getInstance();
        ParsePosition position = new ParsePosition(0);
        Number number = formatter.parse(userInput, position);
        if (position.getIndex() != userInput.length())
            throw new ParseException("failed to parse entire string: " + userInput, position.getIndex());
        doSomething(number);    // If I reach here, I will doSomething

        return;
    }
    catch(Exception e)  {
        // Oh.. user has entered mixture of alpha and number
    }

    doSomethingElse(userInput);  // If I reach here, I will doSomethingElse
    return;

答案 1 :(得分:3)

你最好使用一些正则表达式,例如userInput.matches("[0-9]+")仅用于匹配数字

答案 2 :(得分:2)

DecimalFormat接受任何字符串,如果它以数字开头。

您可以做的是执行额外检查。

try {
  DecimalFormat decimalFormat = (DecimalFormat)     
  NumberFormat.getNumberInstance(<LocaleHere>);
  Number number = decimalFormat.parse(userInput);
  if (number.toString().equals(userInput)) {
    doSomething(number);    // If I reach here, I will doSomething   
    return;
  }
}