评估存储在字符串中的算术表达式(C#)
我正在使用C#中的应用程序,我想要计算一个以字符串forms给出的算术表达式。 就像我得到一个字符串:
string myExpr="4*(80+(5/2))+2";
我想计算算术表达式的结果。 在使用Javascript,PHP等语言时,你可以使用Eval来做这个技巧,这似乎不是C#中的一个选项。
我想可以编写一个代码将它分成无数简单的表达式,计算它们并将它们加在一起,但这需要相当长的时间,而且我可能会遇到很多麻烦。
所以…我的问题,有没有“简单”的方法来做到这一点?
你可以参考一个javascript库,然后做一些像:
var engine = VsaEngine.CreateEngine(); Eval.JScriptEvaluate(mySum, engine);
编辑; 库是Microsoft.JScript
您可以调用JScript.NET eval
函数。 任何.NET语言都可以调用任何其他语言。
你见过http://ncalc.codeplex.com吗?
它具有可扩展性,快速(例如,具有自己的缓存),使您能够通过处理EvaluateFunction / EvaluateParameter事件在运行时提供自定义函数和变量。 它可以解析的示例表达式:
Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); e.Parameters["Pi2"] = new Expression("Pi * Pi"); e.Parameters["X"] = 10; e.EvaluateParameter += delegate(string name, ParameterArgs args) { if (name == "Pi") args.Result = 3.14; }; Debug.Assert(117.07 == e.Evaluate());
它还可以本地处理unicode和许多数据类型。 如果你想改变语法,它会附带一个鹿茸文件。 还有一个支持MEF加载新function的fork。
它还支持逻辑运算符,日期/时间的字符串和if语句。
看到这个答案:
C#数学计算器
我已经使用NCalc取得了巨大的成功。 它非常灵活,允许公式中的变量。 您可以轻松评估您在问题中列出的公式:
string myExpr = "4*(80+(5/2))+2"; decimal result = Convert.ToDecimal(new Expression(myExpr).Evaluate());
您需要实现表达式求值程序。 如果你有背景,这是相当简单的,但它不是“简单”。 解释环境中的Eval实际上在字符串上重新运行语言解析器; 您需要在C#代码中为您关注的位模拟该操作。
搜索“表达式计算器”和“递归下降解析器”以开始。
如果你有Bjarne Stroustrup的C ++编程语言 ,那么在第6章中他将逐步解释(在C ++中)如何完成Chris Tavares所建议的内容。
如果你不熟悉这个程序,它很简单但有点令人兴奋。
我需要为本科项目做类似的事情,我发现了这一点
C#中的反向波兰表示法
教程和代码非常有价值。
它几乎只是将字符串转换为Reverse Polish Notation然后对其进行评估的实现。 它非常易于使用,理解和添加新function。 源代码包含在内。
尝试这样的事情:
int mySum = 4*(80+(5/2))+2; var myStringSum = mySum.toString();