2010-02-11 97 views
3

很容易实现一个“计算器”来解析一个字符串(例如,2^3/2)并计算操作结果。但是,有没有一个图书馆能够做到这一点?在您的应用程序如何评估由字符串表示的数学表达式?

+1

你的意思是(2^3)/ 2或2 ^(3/2)? – Gumbo

+0

它不会那么容易,因为编译语言c#没有eval函数(例如,不像perl) –

+1

你的意思是'2除以3的幂除以2'或'2 XOR 3除以2'? – Earlz

回答

4

dotMath库做这样的样品。

+1

Flee也看起来像一个选项:http://www.codeplex.com/Flee –

+0

+1:我已经使用这个库,它的工程很好 –

1

嵌入IronPython的,然后你可以问它来评估任意复杂的字符串

我觉得他们甚至拥有同样的事情

2

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

不要让它吓倒你,它实际上很容易做出来。

+0

它只是非常简单的情况“容易” –

+1

大多数事情倾向于当它更简单时更容易。 –

+1

我只是说,编写一个解析输入字符串的计算器显然很容易具有欺骗性。这实际上是一个不平凡的问题。如果你不相信我,试试吧。 –

0

结账Reverse Polish notation。它在现代计算器中被广泛使用

+1

我不明白这是如何有用的。 OP正在寻找一个现有的库,而不是寻求实现他自己的解析器(并因此重新发明轮子) –

+0

但知道你正在寻找的东西的名称可能会有所帮助。 –

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