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

时间:2013-06-19 05:12:55

标签: c#

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;

我得到此代码的格式异常为“输入字符串格式不正确”。我知道这是一个简单的问题,但我没有得到任何回答。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

首先,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是没有意义的。

答案 1 :(得分:0)

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

我测试了这些值:5+2结果1050*2结果10050*2+1结果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());