如何检查输入是否为int且介于两个值之间

时间:2012-11-28 15:54:12

标签: java user-input java.util.scanner

我创建了一个方法来查看用户输入的值是否为int,并且介于liminflimsup之间。它返回值,以便我可以将其用作菜单选项。 字符串message告诉用户输入内容,error告诉用户使用limunflimsup之间的数字。

我的问题是,例如,如果用户输入数字10且liminf为7且limsup e 9,则其运行方式与数字10之间的limsupliminf

public static int readInput(String message, String error, int liminf, int limsup, Scanner rd){

    int option = 0;
    do {
        option = rd.nextInt();
        System.out.println(message);
        while (!rd.hasNextInt()) {
            System.out.println("Please enter the option");
            rd.nextLine();
        }
        option = rd.nextInt();
        canal.nextLine();
    } while (option > limsup || option < liminf);

    return option;
}

7 个答案:

答案 0 :(得分:1)

更改while中的条件,如下所示:

while (option <= limsup && option >= liminf);

根据您当前的情况,当您有option = 10limsup = 9时,您的条件option > limsup将评估为true并且正在使用||(或opeartor)即使第二个条件评估为false,整个表达式也会计算为true

答案 1 :(得分:1)

当您检查输入时,您需要做两件事:

  1. 检查该值是否实际为整数
  2. 检查值是否在
  3. 范围内

    要检查值是否为整数,可以使用以下两种方法之一。在hasNextInt上使用Scanner,或使用Integer.parseInt并抓住NumberFormatExceptions。你在评论中说你不能使用第二个,所以我们将使用第一个。

    在致电hasNextInt之前,您始终需要致电nextInt,以便您可以这样做:

    int option = 0;
    System.out.println(message);
    System.out.println("Please enter the option");
    while (!rd.hasNextInt()) {
        rd.nextLine(); // Clears the invalid input
        System.out.println("Please enter the option");
    }
    option = rd.nextInt();
    

    这将循环直到用户输入int,然后它将获得int。请注意,在调用hasNextInt之前不调用nextInt会导致错误,如果您尝试输入非数字,则会在当前代码中发生错误。

    接下来,您需要进行边界检查。如果我没有弄错的话,您希望它在limsupliminf之间,limsup > liminf。我们需要确定允许这种情况的条件。

    之间是通过使用大于较小的数字而小于较大的数字来实现的。在这种情况下,那是option >= liminf && option <= limsup。我们想在时循环,所以我们可以将整个事情包装在!()中:

    int option = 0;
    do {
        System.out.println(message);
        System.out.println("Please enter the option");
        while (!rd.hasNextInt()) {
            rd.nextLine(); // Clears the invalid input
            System.out.println("Please enter the option");
        }
        option = rd.nextInt();
    } while (!(option >= liminf && option <= limsup));
    
    return option;
    

    我会让你弄清楚如何/在哪里打印错误信息,但这应该让你开始。

    值得注意的是:

      如果您使用hasNextInt
    • nextIntnextLineScanner rd = new Scanner(System.in);等将等待用户输入
    • 使用nextLine清除旧输入并强制用户输入新输入
    • 虽然De Morgan的定律很酷,但转换条件的最简单方法就是将其包裹在!()

答案 2 :(得分:0)

如果输入是整数,您可以检查输入是否为Integer.parseInt(input);,如: -

 try {

  String s = "a";
  int i = Integer.parseInt(s);
  return true;
  }

catch(NumberFormatException nfe){return false;}

并改变条件,如: -

while (option <= limsup && option >= liminf);

答案 3 :(得分:0)

以下是测试字符串是否为整数的方法:

private static boolean isInteger( String s ){

    try{
        Integer.parseInt(s);
        return true;
    catch( Exception e ){
        return false;
    }

}

但是,由于你使用的是nextInt()函数,所以这不是必需的,因为你只会以这种方式获得整数输入。

答案 4 :(得分:0)

while ((option > limsup) || (option < liminf))

答案 5 :(得分:0)

我相信,你的readLine正在使它忽略下一个令牌(10)本身,因为它在读取整个行时hasNextInt检查单个令牌。尝试简单如下(使用next并删除额外的rd.nextInt()作为循环中的第一个语句):

 do {
    System.out.println(message);
    while (!rd.hasNextInt()) {
        System.out.println("Please enter the option");
        rd.next();
    }
    //now the next token is int
    option = rd.nextInt();
    //flush the new line if any
    rd.nextLine();
} while (option > limsup || option < liminf);

答案 6 :(得分:0)

你的签到时间错了(选项&gt; limsup ||选项&lt; liminf) 看看选项&gt; limsup,10比9大,这就是你遇到这个问题的原因