C# Windows Form计算器输入验证求助:非数字输入需报错
C# WinForm计算器输入验证解决方案
核心需求实现
要实现输入非数字/合法符号外的字符时弹出错误提示,以及按下回车键时触发验证提示,从以下几个方面修改代码即可解决问题:
1. 修复验证逻辑,编写合法的验证函数
原有验证方法存在逻辑混乱问题,重新编写两个关键验证函数:
- 检查输入是否为空
- 检查输入是否仅包含数字、小数点和负号(计算器需支持小数与负数)
2. 拦截键盘输入,捕获回车键
通过窗体的KeyDown事件捕获回车键,触发验证逻辑;同时确保非法字符无法输入到显示区域。
3. 计算前的安全校验
在点击等于号、运算符号按钮时,先执行输入验证,避免转换失败抛出异常。
修改后的完整代码片段
double num1; double num2; double result; string oper = ""; // 验证输入是否为空 private bool IsInputEmpty() { if (string.IsNullOrWhiteSpace(label1.Text)) { MessageBox.Show("请输入数字"); return true; } return false; } // 验证输入是否为合法数字格式(支持负数、小数) private bool IsInvalidInput() { Regex regex = new Regex(@"^-?\d+(\.\d+)?$"); if (!regex.IsMatch(label1.Text)) { MessageBox.Show("不能输入字母或非法特殊字符"); return true; } return false; } // 窗体按键事件,捕获回车键触发验证 private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (IsInputEmpty() || IsInvalidInput()) { e.Handled = true; return; } // 如需回车键直接触发计算,可取消下面注释 // equals_click_Click(sender, e); } } // 等于号按钮点击事件,添加前置验证 private void equals_click_Click(object sender, EventArgs e) { // 先执行输入验证 if (IsInputEmpty() || IsInvalidInput()) return; // 安全转换输入值 if (!double.TryParse(label1.Text, out num2)) { MessageBox.Show("输入格式错误"); return; } switch (oper) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": // 处理除数为0的特殊情况 if (num2 == 0) { MessageBox.Show("除数不能为0"); return; } result = num1 / num2; break; case "%": result = num1 % num2; break; default: MessageBox.Show("请先选择运算符号"); return; } label3.Text = result.ToString(); } // 减法按钮点击事件,添加验证并修复逻辑 private void button_minus_Click(object sender, EventArgs e) { if (IsInputEmpty() || IsInvalidInput()) return; if (double.TryParse(label1.Text, out num1)) { oper = "-"; label1.Text = ""; label3.Text = ""; } } // 加法按钮点击事件,添加验证 private void addiction_click_Click(object sender, EventArgs e) { if (IsInputEmpty() || IsInvalidInput()) return; if (double.TryParse(label1.Text, out num1)) { oper = "+"; label1.Text = ""; label3.Text = ""; } } // 乘法按钮点击事件,添加验证 private void moltiplication_click_Click(object sender, EventArgs e) { if (IsInputEmpty() || IsInvalidInput()) return; if (double.TryParse(label1.Text, out num1)) { oper = "*"; label1.Text = ""; label3.Text = ""; } } // 除法按钮点击事件,添加验证 private void division_click_Click(object sender, EventArgs e) { if (IsInputEmpty() || IsInvalidInput()) return; if (double.TryParse(label1.Text, out num1)) { oper = "/"; label1.Text = ""; label3.Text = ""; } } // 小数点按钮点击事件,避免重复添加小数点 private void buttonPoint_Click(object sender, EventArgs e) { if (!label1.Text.Contains(".")) { label1.Text += buttonPoint.Text; } } // 其余数字按钮点击事件保持原有逻辑即可,此处省略重复代码
关键修改说明
- 重写验证函数,用正则表达式精准匹配合法数字格式
- 添加窗体
KeyDown事件捕获回车键,触发验证流程 - 所有运算按钮及等于号按钮执行前先验证输入,确保合法性
- 使用
double.TryParse替代直接Parse,避免非法输入导致的异常 - 修复原运算符号按钮中“添加符号后立即清空”的逻辑错误
- 增加除数为0的特殊场景处理
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

