【问题标题】:How to prevent user from entering white space or just hitting enter when a number is expected?如何防止用户输入空格或在需要数字时只按回车键?
【发布时间】:2023-03-24 01:02:01
【问题描述】:

我试图只接受来自用户的数字。如果他们输入字母,此代码可用于向他们提供错误消息。但是,如果他们按 Enter 键或只是空格,则它不起作用。我尝试将一个名为 test 的字符串初始化为 null,然后设置 scnr.nextLine() = test,然后检查 test 是否为空,但是当我这样做时,我不明白如何让程序的其余部分正常运行.扫描仪对我来说非常棘手。请帮忙!

        double mainNumber = 0;

        System.out.print("Enter a number: ");

            if (scnr.hasNextDouble() ){
                mainNumber = scnr.nextDouble();
                System.out.println(mainNumber);
                scnr.nextLine();
            }
            else {
                System.out.println("Sorry, please enter a number.\n");
                scnr.nextLine();
            }

【问题讨论】:

  • 该程序的目的是我将存储在 mainNumber 中的值与它进行计算,然后就结束了。
  • 定义“数字”...有整数、小数、十六进制/八进制/指数/..格式化数字、负数、复数、无理数等。
  • 我在this thread 中找到了对Console#echo(boolean) 的引用,并且该(私有)方法关闭了用户输入回显。有了它,您可以为控制台编写自己的输入掩码。

标签: java


【解决方案1】:

在用户输入有效数字之前,您必须根据需要使用 while 循环和循环输入。

这段代码

public static void main(String[] args) {
    Scanner scnr = new Scanner(System.in);
    double mainNumber = 0;
    boolean isValidNumber = false;

    System.out.print("Enter a number: ");
    while (isValidNumber == false) {
        String line = scnr.nextLine();
        try {
            mainNumber = Double.valueOf(line);
            isValidNumber = true;
        } catch (NumberFormatException e){
            System.out.print("Sorry, please enter a number.\n");
        }
    }

    System.out.println("Main number is: " + mainNumber);
}

有这个示例输出:

Enter a number: sdfgsgxb
Sorry, please enter a number.
xcvbxcvb
Sorry, please enter a number.
gsfdfgsdf
Sorry, please enter a number.
aearg
Sorry, please enter a number.
15.77
Main number is: 15.77

【讨论】:

  • 干得好,这是我准备提交的答案。或者,您可以使用具有相同条件的 do-while 循环,但这会阻止简单打印“错误”消息。
【解决方案2】:

嗯,我猜你的代码是在一个while循环或什么的?这样它就会一直询问,直到用户输入正确的值。

那么你应该(为方便起见)使用String str = scnr.nextString() 而不是nextDouble() 并分析它返回的字符串。

您可以使用 str.trim() 删除空格(然后使用 str.isEmpty() 检查字符串是否为空),并检查它是否是您可以使用正则表达式(How to check that a string is parseable to a double? 以及您可以找到的任何正则表达式教程)的数字或只需使用这个正则表达式:str.matches("\\d+")(如果 str 是数字则返回 true,但此处没有逗号)。

当然,不要忘记在Double.parseDouble( str.replace(",",".") ); 之后将您的字符串转换为双精度。我希望“替换”部分很明显;)

【讨论】:

    【解决方案3】:

    您可以使用以下 sn-p 读取一个double 值:

    Scanner scanner = new Scanner(System.in);
    try {
        double number = Double.parseDouble(scanner.nextLine());
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • 查看标题:“如何防止用户进入空白[...]”
    • @BinkanSalaryman,如果用户只输入空格,我们会得到java.lang.NumberFormatException: empty String
    • 你的答案没有错。但从接受的答案中,我可以看到这个问题表达得很糟糕......
    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2016-07-13
    • 2019-01-16
    • 2015-08-16
    相关资源
    最近更新 更多