在一个文本框中输入数学表达式,并在另一个文本框中显示其结果

本文关键字:文本 结果 显示 另一个 表达式 输入 一个 | 更新日期: 2023-09-27 18:18:54

int a = Convert.ToInt32(Convert.ToString(Text1.Text));//here is the exception i am getting.
int b = Convert.ToInt32(Convert.ToString(Text1.Text));
char c = Convert.ToChar(Convert.ToString(Text1.Text));
int result = Convert.ToInt32(Convert.ToString(Text2.Text));
if (c == '+')
{
    result = a + b;
    Text2.Text += result;
}
else if (c == '-')
{
    result = a - b;
    Text2.Text += result;
}
else if (c == '/')
{
    result = a / b;
    Text2.Text += result;
}
else if (c == '*')
{
    result = a * b;
    Text2.Text += result;
}
else
    return;

我得到这个代码的格式异常为"输入字符串格式不正确"。我知道这是个简单的问题,但是我在任何地方都没有得到答案。

提前感谢。

在一个文本框中输入数学表达式,并在另一个文本框中显示其结果

首先,Convert.ToString(someString)是无用的。其次,您实际上必须解析来自Text1的输入以获得所有相关的部分。

最简单的方法是用一些分隔符分隔字符串:

string[] parts = Text1.Text.Split(' ');
int a = Convert.ToInt32(parts[0]);
int b = Convert.ToInt32(parts[2]);
char c = parts[1][0];

这将处理123 + 456形式的任何输入(每个部分之间正好有一个空格)。或者,您可以使用正则表达式:

var match = Regex.Match(Text1.Text, @"^'s*('d+)'s*([+/*-])'s*('d+)'s*$");
if (match.Success)
{
    int a = Convert.ToInt32(match.Groups[1].Value);
    int b = Convert.ToInt32(match.Groups[3].Value);
    char c = match.Groups[2].Value[0];
}

最后,如果您不打算对结果做任何事情,那么解析Text2就没有意义了。

不可否认,这不是一个漂亮的,但它将完成工作的正数,最多3位。

我测试了这些值:5+2 result 10, 50*2 result 100, 50*2+1 result 101

参见我的Demo

        string[] num = Regex.Split(textBox1.Text, @"'-|'+|'*|'/").Where(s => !String.IsNullOrEmpty(s)).ToArray(); // get Array for numbers
        string[] op = Regex.Split(textBox1.Text, @"'d{1,3}").Where(s => !String.IsNullOrEmpty(s)).ToArray(); // get Array for mathematical operators +,-,/,*
        int numCtr = 0, lastVal=0; // number counter and last Value accumulator
        string lastOp = ""; // last Operator
        foreach (string n in num)
        {
            numCtr++;
            if (numCtr == 1)
            {
                lastVal = int.Parse(n); // if first loop lastVal will have the first numeric value
            }
            else
            {
                if (!String.IsNullOrEmpty(lastOp)) // if last Operator not empty
                {
                    // Do the mathematical computation and accumulation
                    switch (lastOp) 
                    {
                        case "+":
                            lastVal = lastVal + int.Parse(n);
                            break;
                        case "-":
                            lastVal = lastVal - int.Parse(n);
                            break;
                        case "*":
                            lastVal = lastVal * int.Parse(n);
                            break;
                        case "/":
                            lastVal = lastVal + int.Parse(n);
                            break;
                    }
                }
            }
            int opCtr = 0;
            foreach (string o in op)
            {
                opCtr++;
                if (opCtr == numCtr) //will make sure it will get the next operator
                {
                    lastOp = o;  // get the last operator
                    break;
                }
            }
        }
        MessageBox.Show(lastVal.ToString());