如何检查用户输入的数据类型有效性(Java Scanner类)

时间:2013-09-15 21:46:46

标签: java double

我正在尝试创建一个简单的UI,要求用户输入双类型数字,如果他们的输入不是双重类型,程序应该继续打印提示,直到用户输入有效的双重类型。我的代码还没有完全正常工作,因为当用户键入有效的double类型时,除非用户键入另一个double类型的数字,否则程序不会执行任何操作。我想while循环中的条件(sc.hasNextDouble())会消耗第一个有效输入。怎么纠正这个?非常感谢

Scanner sc = new Scanner(System.in);

System.out.println("Type a double-type number:");
while (!sc.hasNextDouble())
{
    System.out.println("Invalid input\n Type the double-type number:");
    sc.next();
}
userInput = sc.nextDouble();    // need to check the data type?

5 个答案:

答案 0 :(得分:4)

由于你可能得到双重输入,最好读取一个字符串,然后尝试将其转换为double。标准模式是:

Scanner sc = new Scanner(System.in);
double userInput = 0;
while (true) {
    System.out.println("Type a double-type number:");
    try {
        userInput = Double.parseDouble(sc.next());
        break; // will only get to here if input was a double
    } catch (NumberFormatException ignore) {
        System.out.println("Invalid input");
    }
}

在输入double之前,循环无法退出,之后userInput将保留该值。

另请注意如何通过将提示放在循环中,可以避免无效输入上的代码重复。

答案 1 :(得分:2)

您的代码非常完美:http://ideone.com/NN42UGhttp://ideone.com/MVbjMz

Scanner sc = new Scanner(System.in);
System.out.println("Type a double-type number:");
while (!sc.hasNextDouble())
{
    System.out.println("Invalid input\n Type the double-type number:");
    sc.next();
}
double userInput = sc.nextDouble();    // need to check the data type?
System.out.println("Here it is: " + userInput);

对于此输入:

test test
int
49,5
23.4

给出:

Type a double-type number:
Invalid input
 Type the double-type number:
Invalid input
 Type the double-type number:
Invalid input
 Type the double-type number:
Invalid input
 Type the double-type number:
Here it is: 23.4

哪个是正确的,因为49,5不是十进制数,因为它使用了错误的分隔符。

答案 2 :(得分:1)

我这样做的方式,对于int和double,将是圆形并检查它是否仍然相同..

double input = sc.nextdouble();
if(input == Math.floor(input) {
    //Double
} else {
    //Int
}

这是一种检查输入是Int,Double,String还是Character

的方法
import java.util.Scanner;


public class Variables {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String input = scan.next();
        try{
            double isNum = Double.parseDouble(input);
            if(isNum == Math.floor(isNum)) {
                System.out.println("Input is Integer");
            }else {
                System.out.println("Input is Double");
            }
        } catch(Exception e) {
            if(input.toCharArray().length == 1) {
                System.out.println("Input is Character");
            }else {
                System.out.println("Input is String");
            }
        }

    }

}

答案 3 :(得分:0)

当您将输入扫描为String时,Double.parseDouble(stringInput);怎么办?然后您可以解析它以查看它是否为double。但是,如果在try-catch语句中包装此静态方法调用,则可以处理未解析double值的情况。

答案 4 :(得分:0)

我认为你的代码没有工作的原因是它首先会检查给定的输入是double类型还是不是sc.hasNextDouble())如果没有那么再接受输入(sc.hasNext() ... no使用此行),然后再次输入(userInput = sc.nextDouble()

我建议这样做:

Scanner sc = new Scanner(System.in);
System.out.println("Type a double-type number:");
double userinput;
while (!sc.hasNextDouble())
{
    System.out.println("Invalid input\n Type the double-type number:");
}

userInput = sc.nextDouble(); 

如果你是第一次提供双输入,你需要再次输入,我想如果你给双输入然后你必须再次提供它,它似乎不可能只提供一次输入。