如何评估字符串表示的数学表达式?

时间:2010-02-11 18:01:24

标签: c# expression-evaluation

很容易实现“计算器”来解析字符串(例如2 ^ 3 / 2)并计算操作结果。但是,是否已有能够执行此操作的库?

6 个答案:

答案 0 :(得分:4)

dotMath库可以做到这一点。

答案 1 :(得分:2)

为了做到这一点,你需要某种数学解析器。我之前使用过C# Expression Parser using RPN by DeepEddie,或者如果你使用的表达式的复杂性范围有限,你可以自己创建。{/ p>

不要让它吓到你,它实际上很容易制作。

答案 2 :(得分:1)

在您的应用中嵌入ironpython,然后您可以要求它评估任意复杂的字符串

我认为他们甚至有同样的样本

答案 3 :(得分:0)

结帐Reverse Polish notation。它广泛用于现代计算器

答案 4 :(得分:0)

您也可以使用JScript库,尽管它已被弃用。不是说你应该,只是你可以。

Microsoft.JScript.Eval.JScriptEvaluate

答案 5 :(得分:0)

我用过这个:

using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;


  public class JScriptEvaluator
  {
        public   int EvalToInteger(string statement)
        {
              string s = EvalToString(statement);
              return int.Parse(s.ToString());
        }

        public   double EvalToDouble(string statement)
        {
              string s = EvalToString(statement);
              return double.Parse(s);
        }

        public   string EvalToString(string statement)
        {
            object o = "-1";
            try
            {
             o=  EvalToObject(statement);
            }
            catch { o = "-1"; }
              return o.ToString();
        }

        public   object EvalToObject(string statement)
        {
              return _evaluatorType.InvokeMember(
                                "Eval",
                                BindingFlags.InvokeMethod,
                                null,
                                _evaluator,
                                new object[] { statement }
                          );
        }

        public JScriptEvaluator()
        {
              CodeDomProvider provider = new Microsoft.JScript.JScriptCodeProvider();

              CompilerParameters parameters;
              parameters = new CompilerParameters();
              parameters.GenerateInMemory = true;

              CompilerResults results;
              results = provider.CompileAssemblyFromSource(parameters, _jscriptSource);

              Assembly assembly = results.CompiledAssembly;
              _evaluatorType = assembly.GetType("Evaluator.Evaluator");

              _evaluator = Activator.CreateInstance(_evaluatorType);
        }

        private   object _evaluator = null;
        private   Type _evaluatorType = null;
        private   readonly string _jscriptSource =

              @"package Evaluator
              {
                 class Evaluator
                 {
                       public function Eval(expr : String) : String 
                       { 
                          return eval(expr); 
                       }
                 }
              }";
  }