2012-03-20 3 views
4

Я пытаюсь построить калькулятор в C#. Теперь я хотел бы узнать, можно ли сделать расчет, который находится внутри текстового поля. Например, пользователь вводит текстовое поле (2*3)+6. Теперь, как я могу сказать, что мой сценарий вычисляет это, а затем выводит результат?Как вычислить введенную пользователем строку в C#?

+1

Если вы хотите создать свое собственное решение с нуля, то посмотрите «Обозначение с обратной полярностью» –

+1

Алгоритм шунтирующего двора, похоже, довольно распространен: http://en.wikipedia.org/wiki/Shunting-yard_algorithm – flai

+0

около дюжины повторяющихся вопросов о SO. [1] (http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net) [2] (http://stackoverflow.com/questions/7727933/is- там-any-other-tools-like-ncalc-available-for-net-development) [3] (http://stackoverflow.com/questions/3972854/c-sharp-parse-math-expression) – CodesInChaos

ответ

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 I не знал, что – Robbie

+3

Это будет работать, но это не то, для чего предназначен DataTable. –

+0

Не имеют опыта работы с этим методом, поэтому я могу быть здесь на тонком льду, но в документации указано «Параметр выражения требует агрегатной функции». - Так это действительно работает? –

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», но этот метод имеет бонус, который вы можете передать в значения для уравнения.

Смежные вопросы