c# - 一些计算器错误
问题描述
所以我想做我的第一个计算器,但它只做加法,每当我使用这个点让我们说 2.2 * 2.2 整个事情都崩溃了,我没有弄清楚我做错了什么。这是它的代码。
using System;
using System.Windows.Forms;
namespace Calculator
{
public partial class Form1 : Form
{
Double resultValue = 0;
String operationPerformed = "";
bool isOperationPerformed = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void Button_Click(object sender, EventArgs e)
{
if ((textBox_Result.Text == "0") || (isOperationPerformed) )
textBox_Result.Clear();
isOperationPerformed = false;
Button button = (Button)sender;
if(button.Text==".")
{
if(!textBox_Result.Text.Contains("."))
textBox_Result.Text = textBox_Result.Text + button.Text;
}else
textBox_Result.Text = textBox_Result.Text + button.Text;
}
private void Operator_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
if (resultValue != 0)
{
buttonEquals.PerformClick();
operationPerformed = button.Text;
resultValue = Double.Parse(textBox_Result.Text);
labelCurrentOperation.Text = resultValue + " " + operationPerformed;
isOperationPerformed = true;
}
else
{
operationPerformed = button.Text;
resultValue = Double.Parse(textBox_Result.Text);
labelCurrentOperation.Text = resultValue + " " + operationPerformed;
isOperationPerformed = true;
}
}
private void buttonClearEntry_Click(object sender, EventArgs e)
{
textBox_Result.Text = "0";
}
private void buttonClear_Click(object sender, EventArgs e)
{
textBox_Result.Text = "0";
resultValue = 0;
}
private void buttonEquals_Click(object sender, EventArgs e)
{
switch(operationPerformed)
{
case "+":
textBox_Result.Text = (resultValue + Double.Parse(textBox_Result.Text)).ToString();
break;
case "-":
textBox_Result.Text = (resultValue + Double.Parse(textBox_Result.Text)).ToString();
break;
case "x":
textBox_Result.Text = (resultValue + Double.Parse(textBox_Result.Text)).ToString();
break;
case "÷":
textBox_Result.Text = (resultValue + Double.Parse(textBox_Result.Text)).ToString();
break;
default:
break;
}
resultValue = Double.Parse(textBox_Result.Text);
labelCurrentOperation.Text = " ";
}
}
}
解决方案
问题是您没有捕获 Double.Parse 函数的格式异常。当它传递字符串“。”时,它会抛出异常。下面的代码通过替换“。”来纠正这个问题。与“0”。例如,我还添加了一个 catch 来检测除以零。
private void Operator_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
if (textBox_Result.Text == ".") textBox_Result.Text = "0";
if (resultValue != 0)
{
buttonEquals.PerformClick();
operationPerformed = button.Text;
resultValue = Double.Parse(textBox_Result.Text, System.Globalization.CultureInfo.InvariantCulture);
labelCurrentOperation.Text = resultValue + " " + operationPerformed;
isOperationPerformed = true;
}
else
{
operationPerformed = button.Text;
resultValue = Double.Parse(textBox_Result.Text, System.Globalization.CultureInfo.InvariantCulture);
labelCurrentOperation.Text = resultValue + " " + operationPerformed;
isOperationPerformed = true;
}
}
private void buttonEquals_Click(object sender, EventArgs e)
{
if (textBox_Result.Text == ".") textBox_Result.Text = "0";
switch(operationPerformed)
{
case "+":
textBox_Result.Text = (resultValue + Double.Parse(textBox_Result.Text, System.Globalization.CultureInfo.InvariantCulture)).ToString(System.Globalization.CultureInfo.InvariantCulture);
break;
case "-":
textBox_Result.Text = (resultValue - Double.Parse(textBox_Result.Text, System.Globalization.CultureInfo.InvariantCulture)).ToString(System.Globalization.CultureInfo.InvariantCulture);
break;
case "x":
textBox_Result.Text = (resultValue * Double.Parse(textBox_Result.Text, System.Globalization.CultureInfo.InvariantCulture)).ToString(System.Globalization.CultureInfo.InvariantCulture);
break;
case "÷":
// check for divide by 0
double check = Double.Parse(textBox_Result.Text, System.Globalization.CultureInfo.InvariantCulture);
if (check != 0)
{
textBox_Result.Text = (resultValue / check).ToString(System.Globalization.CultureInfo.InvariantCulture);
}
else
{
MessageBox.Show("divide by zero!");
}
break;
}
resultValue = Double.Parse(textBox_Result.Text, System.Globalization.CultureInfo.InvariantCulture);
labelCurrentOperation.Text = " ";
}
推荐阅读
- python - 如何创建一个包含单引号和双引号 python 的字符串?
- scala - Spark:mapPartitions 对象不可序列化
- html - 调整表格中单元格的大小
- sql - 具有唯一行集的左外连接
- python - 3D 条形图中的 LEGEND 作为颜色图
- angular - 重新加载时 angular + nginx + docker 路由配置问题
- excel - Excel中的区域独立数字连接
- python-3.x - 为什么我在字典中使用逗号时会出现语法错误,即使我应该使用它们
- javascript - 如何js调用函数并访问调用者参数
- javascript - 使用 javascript 和 jquery 更改菜单项颜色