评估存储在字符串中的算术表达式(C#)

时间:2011-01-06 22:06:04

标签: c#

我正在使用C#中的应用程序,我想在其中计算以字符串形式给出的算术表达式。 就像我得到一个字符串:

string myExpr="4*(80+(5/2))+2";

我想计算算术表达式的结果。 在使用Javascript,PHP等语言时,你可以使用Eval来做这个似乎不是C#的选项。

我想可以编写一个代码将它分成无数简单的表达式,计算它们并将它们加在一起,但这需要相当长的时间,而且我可能会遇到很多麻烦。

所以...我的问题,有没有'简单'的方法来做到这一点?

9 个答案:

答案 0 :(得分:5)

您可以调用JScript.NET eval函数。任何.NET语言都可以调用任何其他语言。

答案 1 :(得分:5)

您可以参考一个javascript库,然后执行以下操作:

var engine = VsaEngine.CreateEngine();
Eval.JScriptEvaluate(mySum, engine);

编辑; 库是Microsoft.JScript

答案 2 :(得分:5)

你见过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加载新功能的fork。

它还支持逻辑运算符,日期/时间的字符串和if语句。

答案 3 :(得分:3)

看到这个答案:

C# Math calculator

答案 4 :(得分:2)

我使用NCalc取得了巨大成功。它非常灵活,允许公式中的变量。您可以轻松评估您在问题中列出的公式:

string myExpr = "4*(80+(5/2))+2";
decimal result = Convert.ToDecimal(new Expression(myExpr).Evaluate());

答案 5 :(得分:0)

您需要实现表达式求值程序。如果你有背景,这是相当简单的,但它不是“简单”。解释环境中的Eval实际上在字符串上重新运行语言解析器;您需要在C#代码中为您关注的位模拟该操作。

搜索“表达式评估程序”和“递归下降解析器”以开始使用。

答案 6 :(得分:0)

如果你有Bjarne Stroustrup的 The C ++ Programming Language ,在第6章中他将逐步解释(在C ++中)如何正确地完成Chris Tavares的建议。

如果你不熟悉这个程序,这很简单但有点令人兴奋。

答案 7 :(得分:0)

我需要为本科项目做类似的事情,我发现了这个

Reverse Polish Notation In C#

教程和代码非常有价值。

它几乎只是将字符串转换为Reverse Polish Notation然后对其进行评估的实现。它非常易于使用,理解和添加新功能。 包含源代码。

答案 8 :(得分:-1)

尝试这样的事情:

int mySum = 4*(80+(5/2))+2;

var myStringSum = mySum.toString();