C# WinForms计算器减法变加法、乘除报FormatException错误问题求解
问题根因
- 所有运算符点击事件中,你将运算符符号直接赋值给了
txtBox.Text,这是核心错误:- 加法场景下,C#的
Convert.ToDecimal()支持解析带+前缀的数字字符串(比如+123可以正常转为123),所以加法功能可以正常运行 - 减法场景下,用户输入数字后
txtBox的内容会变成-数字,计算时执行保存的数字 - 负数,结果等价于两个数相加,就出现了减法变加法的问题 - 乘除场景下,
*、/不属于合法的数字字符串前缀,Convert.ToDecimal()无法解析*123、/123这类字符串,直接抛出System.FormatException异常
- 加法场景下,C#的
修复方案
直接删掉所有运算符点击事件中给txtBox.Text赋值运算符的代码即可,如果你需要展示已选择的运算符,可以将运算符拼接显示在上方的txtUpperBox中。
修复后的运算符点击事件示例:
private void btnPlus_Click(object sender, EventArgs e) { SaveNumber(); txtBox.Clear(); savedOperator = "+"; // 删掉原来的 txtBox.Text = "+"; 代码,若要显示运算符可以加下面这行 txtUpperBox.Text += " +"; } private void btnMinus_Click(object sender, EventArgs e) { SaveNumber(); txtBox.Clear(); savedOperator = "-"; txtUpperBox.Text += " -"; } private void btnTimes_Click(object sender, EventArgs e) { SaveNumber(); txtBox.Clear(); savedOperator = "*"; txtUpperBox.Text += " *"; } private void btnDivide_Click(object sender, EventArgs e) { SaveNumber(); txtBox.Clear(); savedOperator = "/"; txtUpperBox.Text += " /"; }
额外优化建议
可以把Calculation方法里的多个独立if改为if-else if结构,避免不必要的分支判断,同时补充除数为0的异常拦截:
private void Calculation() { decimal answer; decimal currentNumber = Convert.ToDecimal(txtBox.Text); if (savedOperator == "+") { answer = savedNumber + currentNumber; } else if (savedOperator == "-") { answer = savedNumber - currentNumber; } else if (savedOperator == "*") { answer = savedNumber * currentNumber; } else if (savedOperator == "/") { if (currentNumber == 0) { txtBox.Text = "除数不能为0"; savedOperator = ""; txtUpperBox.Text = ""; return; } answer = savedNumber / currentNumber; } else { return; } txtBox.Text = answer.ToString(); savedOperator = ""; txtUpperBox.Text = ""; }
内容的提问来源于stack exchange,提问作者Cuckboi69
相关产品推荐
相关产品推荐

