2

我正在尝试制作一个简单的 UI,要求用户输入双精度类型的数字,如果他们的输入不是双精度类型,则程序应继续打印提示,直到用户输入有效的双精度类型。我下面的代码还不能正常工作,因为当用户键入有效的双精度类型时,除非用户键入另一个双精度类型数字,否则程序不会执行任何操作。我猜 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?
4

5 回答 5

4

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

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");
    }
}

在输入双精度值之前,循环不能退出,之后userInput将保持该值。

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

于 2013-09-15T23:48:20.667 回答
3

您的代码完美运行: 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它不是十进制数,因为它使用了错误的分隔符。

于 2013-09-15T21:55:33.917 回答
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");
            }
        }

    }

}
于 2013-09-15T21:53:36.297 回答
0

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

于 2013-09-15T21:54:42.570 回答
0

我认为您的代码无法正常工作的原因是首先它会检查给定的输入是否为双精度类型(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(); 

如果您第一次提供双重输入,则需要再次提供输入,我认为如果您每次提供双重输入,那么您必须再次提供,看起来不可能只提供一次输入。

于 2017-04-04T10:17:33.427 回答