2012-03-20 87 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”,但是这种方法也可以将值传递给等式。

相关问题