在一个文本框中输入数学表达式,并在另一个文本框中显示其结果
本文关键字:文本 结果 显示 另一个 表达式 输入 一个 | 更新日期: 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());