验证双精度字符串时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,提问作者გიორგი მაცუკატოვი
相关产品推荐
相关产品推荐

