【问题标题】:In Java, how do I check if input is a number?在Java中,如何检查输入是否为数字?
【发布时间】:2012-12-30 20:40:51
【问题描述】:

我正在制作一个简单的程序,让您可以添加比赛的结果,以及他们过去完成的秒数。所以要输入时间,我是这样做的:

int time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));

所以我的问题是,如果用户输入的不是正数,我该如何向用户显示错误消息?就像 MessageDialog 一样,它会给你错误,直到你输入一个数字。

【问题讨论】:

  • @PradeepSimha 你有问题。您使用正则表达式。现在你有两个问题。
  • 请添加更多标签。你在使用 Swing 吗?
  • 如果是整数秒,则为用户提供JSpinnerSpinnerNumberModel,如this answer 所示。
  • 只需运行您的代码并输入一些无效的输入。你会得到例外。所以你要做的就是处理你的异常。
  • 如果需要,不能立即解析;您必须首先检查零长度。

标签: java swing parseint


【解决方案1】:
int time;
try {
    time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));
} catch (NumberFormatException e) {
    //error
}

如果Integer.parseInt 无法解析int,它将抛出NumberFormatException。 如果您只想在输入无效时重试,请将其包装在 while 循环中,如下所示:

boolean valid = false;
while (!valid) {
    int time;
    try {
        time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));
        if (time >= 0) valid = true;
    } catch (NumberFormatException e) {
        //error
        JOptionPane.showConfirmDialog("Error, not a number. Please try again.");
    }
}

【讨论】:

  • 您精心编写的代码现在与input.matches("\\d+") 完全相同。我真的没有看到这个最简单的正则表达式比你精心设计的方案有更多问题的角度,其中涉及常规流控制的异常,清晰的代码气味。
  • @MarkoTopolnik 首先,我的“详细”代码是 11 行,其中四行实际上做了一些事情。此外,使用您的方法,您还必须添加一个 while 循环、新的 input 变量等。抛开繁琐性不谈,我认为这是向新的 Java 程序员教授异常等的一种非常有效的方法。
  • 好的,所以核心部分是try {return Integer.parseInt(input) >= 0;} catch (NumberFormatException e) {return false; }return input.matches("\\d+");。教人们使用异常(未经检查,不少于!)进行常规流控制只是糟糕教学的一个例子。教他们不要使用正则表达式进行字符串验证是另一个相同的例子。
  • @MarkoTopolnik 鉴于获得适合 Java int 的整数的明显意图,您需要的不仅仅是 input.matches("\\d+")。它将接受一个 100 位数字的字符串。
  • +1 @PatriciaShanahan 点数。不过,它很容易修复,例如 \\d{1,3},通过验证数字范围更进一步。
【解决方案2】:

当 Integer.parseInt 的参数不是整数时,Integer.parseInt 抛出 NumberFormatException,使用 try Catch 并显示所需的错误消息,将其保留在 do while 循环中,如下所示

   int   time = -1;
   do{
       try{
            time = Integer.parseInt(JOptionPane.showInputDialog("Enter seconds"));
       }
       catch(NumberFormatException e){

       }
   }while(time<=0);

【讨论】:

    【解决方案3】:

    如果JOptionPane.showInputDialog("Enter seconds") 不是有效数字,您将得到NumberFormatException。对于正数检查,只需检查time &gt;=0

    【讨论】:

      【解决方案4】:

      取决于你想如何解决它。 一种简单的方法是将时间声明为整数,然后执行以下操作:

      Integer time;    
      while (time == null || time < 0) {
          Ints.tryParse(JOptionPane.showInputDialog("Enter seconds"));
      }
      

      当然,这需要您使用 google guava。 (其中包含许多其他有用的功能)。

      另一种方法是使用上面的代码,但使用标准的 tryparse,捕获 NumberFormatException 并且在 catch 中什么都不做。

      有很多方法可以解决这个问题。

      或者不重新发明轮子而只使用: NumberUtils.isNumberStringUtils.isNumeric 来自 Apache Commons Lang

      【讨论】:

        猜你喜欢
        • 2011-08-05
        • 2021-09-14
        • 2013-11-24
        • 2011-07-22
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        相关资源
        最近更新 更多