我想评估用户在文本框中输入的数学表达式。到目前为止我已经这样做了
string equation, finalString;
equation = textBox1.Text;
StringBuilder stringEvaluate = new StringBuilder(equation);
stringEvaluate.Replace("sin", "math.sin");
stringEvaluate.Replace("cos", "math.cos");
stringEvaluate.Replace("tan", "math.tan");
stringEvaluate.Replace("log", "math.log10");
stringEvaluate.Replace("e^", "math.exp");
finalString = stringEvaluate.ToString();
StringBuilder replaceI = new StringBuilder(finalString);
replaceI.Replace("x", "i");
double a;
for (int i = 0; i<5 ; i++)
{
a = double.Parse(finalStringI);
if(a<0)
break;
}
当我运行此程序时,它会出现错误"Input string was not in a correct format."
并突出显示a=double.Parse(finalStringI);
我使用了预先定义的表达式a = i * math.log10(i)-1.2并且它可以工作,但是当我在文本框中输入相同的东西时它没有。 我做了一些搜索,它提出了与在运行时编译代码有关的事情。
任何想法如何做到这一点? 我是一个绝对的初学者。 谢谢:))
答案 0 :(得分:2)
问题出在您的stringEvaluate
StringBuilder中。当你用“math.sin”替换“sin”时,stringEvaluate
中的内容仍然是一个字符串。你有正确的想法,但你得到的错误是因为这个事实。
Math.sin
是Math
类中的一种方法,因此无法像a = double.Parse(finalStringI);
调用那样对其进行操作。
实现目标将是一项相当大的任务,但我会这样做:
solution
的双精度。StringBuilder
类将其拆分。例如,如果遇到“罪”,请将Math.sin
添加到运算符集合(我将使用类型对象)。希望这会有所帮助:)
答案 1 :(得分:0)
.Parse
方法(Int.Parse
,double.Parse
等) 仅 取一个字符串,例如“25”或“3.141”并将其转换为匹配值类型(int 25或double 3.141)。他们不会评估数学表达式!
你几乎必须编写自己的文本解析器和解析树评估器,或者探索运行时代码生成或MSIL代码发射。
在StackOverflow答案的Q&amp; A格式中,这两个主题都无法涵盖。
答案 2 :(得分:0)
看一下这篇博文:
听起来它几乎与你想做的事情有关。评估数学表达式并不像解析double
那样简单(它实际上只适用于像“1.234”这样的字符串,而不是“1 + 2.34”),但显然它是可能的。
答案 3 :(得分:0)
您可以使用框架包含的eval
函数来实现JScript.NET代码。
更多详情:http://odetocode.com/code/80.aspx
或者,如果你不害怕使用标记为“已弃用”的类,那很简单:
static string EvalExpression(string s)
{
return Microsoft.JScript.Eval.JScriptEvaluate(s, null, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()).ToString();
}
例如,输入"Math.cos(Math.PI / 3)"
,结果为"0.5"
(正确的余弦为60度)