How can I evaluate a math expression represented by a string?

后端 未结 6 2116
梦谈多话
梦谈多话 2021-01-06 15:56

It\'s easy to implement a \"Calculator\" to parse a string (e.g., 2 ^ 3 / 2) and compute the result of operations. But, is there a library already capable of d

6条回答
  •  甜味超标
    2021-01-06 16:00

    I have used this :

    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); 
                           }
                     }
                  }";
      }
    

提交回复
热议问题