2012-03-20 84 views
4

我想在C#中構建一個計算器。現在我想知道是否有可能做一個計算,這是在一個文本框內。例如,用戶進入文本框(2*3)+6。現在我該如何告訴我的腳本計算這個值然後輸出結果?如何計算用戶在C#中輸入的字符串?

+1

如果要從頭開始創建自己的解決方案,然後查找「逆波蘭式」 – 2012-03-20 22:14:37

+1

調度場算法似乎是很常見的藏漢:有http://en.wikipedia.org/wiki/Shunting-yard_algorithm – flai 2012-03-20 22:15:23

+0

大約有十幾個關於SO的重複問題。 [1](http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net)[2](http://stackoverflow.com/questions/7727933/is-還有,任何 - 其他工具樣ncalc可用換網發展)[3](http://stackoverflow.com/questions/3972854/c-sharp-parse-math-expression) – CodesInChaos 2012-03-20 22:32:01

回答

13

你可以使用Compute方法:

using System; 
using System.Data; 

class Program 
{ 
    static void Main() 
    { 
     var result = new DataTable().Compute("(2*3)+6", null); 
     Console.WriteLine(result); 
    } 
} 

打印:

12 

當然不要指望能夠計算出使用這種方法的任何複雜的功能。您僅限於basic arithmetic

如果你想處理更復雜的表達式,你可以使用CodeDOM

+3

+1我不知道 – Robbie 2012-03-20 22:16:04

+3

這會工作,但絕不是DataTable的設計目的。 – 2012-03-20 22:17:28

+0

有這種方法沒有以往的經驗,所以我可能會如履薄冰這裏,但文檔指出'表達參數需要一個總function.' - 那麼這將真正的工作? – 2012-03-20 22:17:42

1

可以使用System.Linq.Dynamic庫做到這一點:

`

static void Main(string[] args) 
    { 
     const string exp = "(A*B) + C"; 

     var p0 = Expression.Parameter(typeof(int), "A"); 
     var p1 = Expression.Parameter(typeof(int), "B"); 
     var p2 = Expression.Parameter(typeof(int), "C"); 

     var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p0, p1, p2 }, typeof(int), exp); 

     var result = e.Compile().DynamicInvoke(2, 3, 6); 

     Console.WriteLine(result); 
     Console.ReadKey(); 
    } 

`

你可以下載它here副本。

N.B.該字符串可能只是「(2 * 3)+ 6」,但是這種方法也可以將值傳遞給等式。

相關問題