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

计算存储在字符串中的算术表达式(C#),c#,C#,我正在用C#编写一个应用程序,其中我想计算一个以字符串形式给出的算术表达式。 就像我得到了一根绳子: string myExpr="4*(80+(5/2))+2"; 我想计算算术表达式的结果。 在使用Javascript、PHP等语言时,您可以使用Eval来实现这一点,但在C#中这似乎不是一个选项 我认为可以编写一个代码,将其划分为无数个简单表达式,计算它们并将它们相加,但这需要相当长的时间,而且在尝试这样做时可能会遇到很多麻烦 所以。。。我的问题是,有什么“简单”的方法可以做到这一点吗?您可

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

string myExpr="4*(80+(5/2))+2";
我想计算算术表达式的结果。 在使用Javascript、PHP等语言时,您可以使用Eval来实现这一点,但在C#中这似乎不是一个选项

我认为可以编写一个代码,将其划分为无数个简单表达式,计算它们并将它们相加,但这需要相当长的时间,而且在尝试这样做时可能会遇到很多麻烦


所以。。。我的问题是,有什么“简单”的方法可以做到这一点吗?

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

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


搜索“表达式计算器”和“递归下降解析器”开始使用。

尝试以下操作:

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

var myStringSum = mySum.toString();

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

var engine = VsaEngine.CreateEngine();
Eval.JScriptEvaluate(mySum, engine);
编辑;
图书馆是微软。JScript < /P> < P>如果你有Bjarne Stroustrup的C++编程语言,在第6章他将逐步解释(C++)如何做Chris Tavares建议的。
这很简单,但如果你不熟悉这个过程,就有点令人兴奋。

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

教程和代码非常有价值

它几乎只是一个将字符串转换为反向波兰符号然后对其求值的实现。它非常易于使用、理解和添加新功能。 包括源代码。

我使用它非常成功。它非常灵活,允许在公式中使用变量。您在问题中列出的公式可以很容易地进行评估:

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

它是可扩展的、快速的(例如有自己的缓存),使您能够通过处理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和许多数据类型。如果你想更改语法,它附带一个鹿角锉。还有一个fork支持MEF加载新函数


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

他想要的基本上是相反的。表达式存储在一个字符串中。虽然我很欣赏这样的尝试,它将导致一个包含332的字符串。的可能重复看起来非常有希望,但这是我第一次测试。感谢大家提供的精彩且该死的快速帮助=DVS2010说:Microsoft.JScript.Vsa.VsaEngine已被弃用。