You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

验证双精度字符串时While循环重复打印一行的问题(简易计算器)

解决你的计算器输入验证重复提示问题

嘿,我一眼就看到问题出在哪了——你用来验证双精度数的正则表达式完全不对,而且循环逻辑也可以优化一下,这才导致了重复打印输入提示的bug。

问题根源分析

你写的正则"[-+]?[0-9]..."只能匹配类似+1abc或者-2xyz这种格式的字符串(...代表任意三个字符),完全识别不了合法的双精度数,比如3.14、-0.5或者1e3这种常见格式。不管你输入什么合法数字,这个正则都判定为不匹配,所以while循环会一直触发,重复打印输入提示。

修复方案

我给你两种修复方式,你可以根据需求选择:

方式1:修正正则表达式+优化循环逻辑

把错误的正则替换成能匹配所有合法双精度数的版本,同时用do-while循环避免重复代码:

import java.util.Scanner;
public class Calculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String answer = "yes";
        double finalValue;
        while (answer.equalsIgnoreCase("Yes")) {
            String firstNumber;
            // 用do-while先执行输入操作,再验证,避免重复写提示和输入代码
            do {
                System.out.print("Enter First Number: ");
                firstNumber = scanner.next();
            } while (!firstNumber.matches("[-+]?\\d*(\\.\\d+)?([eE][-+]?\\d+)?"));
            
            // 把合法的字符串转成double,继续你的计算逻辑
            double num1 = Double.parseDouble(firstNumber);
            // 其余计算逻辑省略
        }
        scanner.close(); // 记得用完关闭Scanner哦
    }
}

这个正则的含义是:

  • [-+]?:允许可选的正负号
  • \\d*:整数部分可以为空(比如.5也是合法的浮点数)
  • (\\.\\d+)?:可选的小数部分(必须是小数点加至少一位数字)
  • ([eE][-+]?\\d+)?:可选的科学计数法格式(比如1.2e4或者-5E-2)

方式2:用try-catch做输入验证(更稳健)

其实正则表达式难免会有遗漏的合法格式,比如Infinity或者NaN(如果你的计算器需要支持的话)。用Java自带的Double.parseDouble()配合try-catch会更可靠:

import java.util.Scanner;
public class Calculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String answer = "yes";
        double finalValue;
        while (answer.equalsIgnoreCase("Yes")) {
            double num1;
            do {
                System.out.print("Enter First Number: ");
                String input = scanner.next();
                try {
                    num1 = Double.parseDouble(input);
                    break; // 输入合法,直接跳出循环
                } catch (NumberFormatException e) {
                    System.out.println("Invalid number format, please try again.");
                }
            } while (true);
            
            // 拿到合法的num1后,继续你的计算逻辑
            // 其余计算逻辑省略
        }
        scanner.close();
    }
}

这种方法不需要写复杂的正则,直接利用Java的类型解析能力,能覆盖所有合法的双精度数格式,出错时还能给用户更友好的提示。

内容的提问来源于stack exchange,提问作者გიორგი მაცუკატოვი

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:27:59