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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:20:41