计算器显示错误:'输入字符串的格式不正确。'

时间:2017-11-04 16:04:42

标签: c# calculator

我试图制作一个计算器,而且我有点坚持使用mod和exp操作,每当我尝试使用它们时,我都会遇到错误:

  

System.FormatException:'输入字符串的格式不正确。'

这是发生错误的事件:

private void Equal_Click(object sender, EventArgs e)
        {
            switch (operationPerf)
            {
                case "+":
                    TB.Text = (result + Double.Parse(TB.Text)).ToString();
                    CO.Text = "";
                    break;
                case "-":
                    TB.Text = (result - Double.Parse(TB.Text)).ToString();
                    CO.Text = "";
                    break;
                case "*":
                    TB.Text = (result * Double.Parse(TB.Text)).ToString();
                    CO.Text = "";
                    break;
                case "/":
                    TB.Text = (result / Double.Parse(TB.Text)).ToString();
                    CO.Text = "";
                    break;
                case "Mod":
                    TB.Text = (result % Double.Parse(TB.Text)).ToString();
                    CO.Text = "";
                    break;
                case "Exp":
                    TB.Text = Math.Exp(Double.Parse(TB.Text) * Math.Log((result) * 4)).ToString();
                    CO.Text = "";
                    break;
                default:
                    break;
            }
            result = Double.Parse(TB.Text); // Here is where the error happens
            CO.Text = "";
        }

2 个答案:

答案 0 :(得分:0)

可能operationPerf不是预期的运算符,因此执行默认情况并且文本框仍然包含原始表达式(例如"23Exp3"),当然,它不能转换为{ {1}}。

您应该将计算器逻辑与输入和输出分开。在单独的代码文件(Calculator.cs)中创建double

Calculator

它更容易理解,因为它只包含纯数学,不需要任何解析或格式化。

在表单字段中(在表单类的顶部),您可以声明

public class Calculator
{
    public double Result { get; set; }

    public void Calculate(string operation, double operand)
    {
        switch (operation)
        {
            case "+":
                Result = Result + operand;
                break;
            case "-":
                Result = Result - operand;
                break;
            case "*":
                Result = Result * operand;
                break;
            case "/":
                Result = Result / operand;
                break;
            case "Mod":
                Result = Result % operand;
                break;
            case "Exp":
                Result = Math.Exp(operand * Math.Log(Result * 4));

                // Did you want this instead?
                // Result = Math.Pow(Result, operand);
                break;
            default:
                break;
        }
    }
}

事件处理程序也更容易

public partial class Form1 : Form
{
    private Calculator _calculator = new Calculator();

    ...
}

如果文本框仍包含private void Equal_Click(object sender, EventArgs e) { if (Double.TryParse(TB.Text, out double operand)) { _calculator.Calculate(operationPerf, operand); TB.Text = _calculator.Result.ToString(); CO.Text = ""; } else { MsgBox.Show("The TextBox does not contain a number"); } } ,您将无法将其转换为"23Exp3"。使用不同的文本框输入操作,操作符(数字)和结果,或将字符串分成三部分(2个数字和操作)。

我真的不理解double背后的逻辑。由于我不知道预期的行为,我不能给你任何建议。您想要使用Math.Exp(operand * Math.Log(Result * 4))吗?

Math.Pow
  

返回指定数量的指定数字。

请参阅:Math.Pow Method (Double, Double)

答案 1 :(得分:0)

您要求用户输入以下内容: 10Exp3 。而且你希望你的程序将10提高到3的幂,然后显示结果。所以在这种情况下你期望1000。但你只是这样做:

case "Exp":
    TB.Text = Math.Exp(Double.Parse(TB.Text) * Math.Log((result) * 4)).ToString();

您的代码的第一个问题是,您使用的是Exp,因为这是Exp的文档:

  

将e提升到指定的幂。

您希望将 e 提升到指定的电量吗?你不可以。所以你不能使用那种方法。但即使你可以并且想(也许你确实想要 e ),计算机无法将 10Exp3 转换为数字 - 你必须告诉它该怎么做。

以下是如何(更清晰地阅读我的评论内容):

var input = "10Exp3";
// Let's split the numbers using <Exp>
var splits = input.Split(new[] { "Exp" }, StringSplitOptions.None);

// Let's try and convert the first part into a double and see if it works
double numberBase = 0;
if (!double.TryParse(splits[0], out numberBase))
{
    // The part before the word Exp is
    // not a number, perhaps show an error to the user in a message box
}

// Now let's try and convert the second part 
double exponent = 0;
if (!double.TryParse(splits[1], out exponent))
{
    // The part after the word Exp is
    // not a number, perhaps show an error to the user in a message box
}

// Now we will call the Pow method or use Math.Exp if you want e
double result = Math.Pow(numberBase, exponent);