Подтвердить что ты не робот

Каков наилучший способ выполнения математического выражения?

Возможные дубликаты:
Есть ли математический оценщик строк в .NET?
Лучший и самый короткий способ оценки математических выражений

У меня есть строковая переменная

string exp = "12+34+4*56+(23*45+12)2/30"

Каков наилучший способ сделать это? без использования сторонней dll?

4b9b3361

Ответ 1

Вам нужен математический анализатор выражений. Лучший способ, на мой взгляд, не изобретать колесо. Существующее решение с открытым исходным кодом NCalc является хорошим выбором.

Ответ 2

Сначала переведите его в Дерево выражений. Если вы используете встроенные классы Expression, вы получаете бесплатный метод компиляции, который дает вам скомпилированный делегат, который, таким образом, довольно быстро оценивается. Это полезно, если вы хотите оценить свое выражение для разных параметров.

Ответ 3

Классический способ Кнута - сначала преобразовать выражение Infix в Postfix, а затем оценить выражение постфикса, см. текст ссылки. Оба эти этапа используют стек для выполнения большей части обработки и довольно легко выполняются.

Ответ 4

Использовать IronPython:

ScriptEngine engine = PythonSingleton.Instance.ScriptEngine;
ScriptSource source =
engine.CreateScriptSourceFromString(code, SourceCodeKind.Expression);

Object res = source.Execute();

(Код скопирован из в этой статье)

Ответ 5

Добавьте [, ] в качестве операторов внутри начала и конца строки, а затем:

Чтение номеров заполняет их в операторе стека и чтения и делает то же самое, когда вы богаты оператором, значение которого ниже или равно предыдущему оператору в предыдущем операторе стека POP и действует на доступные числа в стекх чисел: *: 3,/: 3,): 4, +: 1, -: 1

[12+34+4*56] ==>
Round 1: Numbers Stack: 12, Operator stack:[
Round 2: Numbers Stack: 12, Operator stack:[, +(1)
Round 3: Numbers Stack:12,34, Operator stack: [,+(1)
Round 4: Numbers Stack:12,34, Visited new operator with same or lower value (1) remove previous operator and pop 2 number from number stack and operate on them: So
Round 4: Numbers Stack:46, Operator stack: [,+(1)
Round 5: Numbers Stack:46,4 , Operator stack: [,+(1)
Round 6: Numbers Stack:46,4 , Operator stack: [,+(1),*(2)
Round 7: Numbers Stack:46,4,56, Operator stack: [,+(1),*(2)
Round 7: Numbers Stack:46,4,56, Operator stack: [,+(1),*(2) now operator item `]` want to be add, and it priority is lower than all operators so operators sould be remove from stack and by each operator one number going to be removed:
Round 7: Numbers Stack:46,224 Operator stack: [,+(1),
Round 8: Numbers Stack:270 Operator stack: [,
Round 8: return 270, because ']' intered in  Operator stack

Ответ 6

Это немного взломать, но я использую javascript eval function в .net через:

var myEngine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
string result =  Microsoft.JScript.Eval.JScriptEvaluate(expression, myEngine).ToString();

В качестве дополнительного бонуса вы можете смешать математические функции в своем выражении, если необходимо