2010-02-11 76 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); 
         } 
       } 
       }"; 
    }