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

jtjikinw  于 2021-07-12  发布在  Java
关注(0)|答案(5)|浏览(666)

我试图制作一个简单的用户界面,要求用户输入双精度数字,如果他们的输入不是双精度数字,程序应该一直打印提示,直到用户输入一个有效的双精度数字。我下面的代码还不能正常工作,因为当用户键入有效的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?
ih99xse1

ih99xse11#

由于可能无法输入双精度,最好读入字符串,然后尝试将其转换为双精度。标准模式是:

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 将保持该值。
还要注意,通过将提示放在循环中,可以避免在无效输入上重复代码。

wko9yo5t

wko9yo5t2#

你的代码工作得很完美:http://ideone.com/nn42ug 以及http://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 不是十进制数,因为它使用了错误的分隔符。

daolsyd0

daolsyd03#

我会这样做,对于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");
            }
        }

    }

}
jjhzyzn0

jjhzyzn04#

那怎么办 Double.parseDouble(stringInput); 当您将输入扫描为一个字符串时,您可以解析它以查看它是否是一个double。但是,如果将此静态方法调用 Package 在try-catch语句中,则可以处理不解析双精度值的情况。

5ssjco0h

5ssjco0h5#

我认为你的代码不工作的原因是首先它会检查给定的输入是否是double类型( sc.hasNextDouble() )如果没有,则再次输入( sc.hasNext() ... 不使用这一行),然后再次输入( 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();

如果你第一次提供双重输入,你需要再次提供输入,我认为如果你在任何时候提供双重输入,那么你必须再次提供,看起来不可能只提供一次输入。

相关问题