首页 > 解决方案 > 一些计算器错误

问题描述

所以我想做我的第一个计算器,但它只做加法,每当我使用这个点让我们说 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 = " ";
        }
    }
}

标签: c#calculator

解决方案


问题是您没有捕获 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 = " ";
        }

推荐阅读