Возможные дубликаты:
В.NET существует ли строковое математическое средство анализа?
Преобразование строкового выражения к Целочисленному значению с помощью C#
Лучший и самый короткий способ оценить математические выражения
оценка c# представляет в виде строки “3* (4+2)” интервал урожая 18Существует ли способ вычислить математические выражения как (2-3/4*12) по-другому, чем представленный здесь?
DataTable имеет метод Compute , который позволяет вам написать следующее:
var result = new DataTable().Compute("2-3/4*12", null);
Обратите внимание, что это ограничено простыми математическими выражениями.
Другой вариант заключается в использовании динамического языка в DLR, такого как IronPython и IronRuby. Просмотрите этот пост :
var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");
Вы также можете проверить библиотеку NCalc на GitHub .
Ознакомьтесь с FLEE (Fast Lightweight Expression Evaluator) - http://flee.codeplex.com/
Flee - это синтаксический анализатор и вычислитель выражений для платформы .NET. Он позволяет вычислять значение строковых выражений, таких как sqrt (a ^ 2 + b ^ 2) во время выполнения. Он использует настраиваемый компилятор, строго типизированный язык выражений и легкий кодогенератор для компиляции выражений непосредственно в IL. Это означает, что вычисление выражений происходит очень быстро и эффективно. Попробуйте демонстрацию, которая позволяет вам создавать изображения на основе выражений, и убедитесь в этом сами.
Это бесплатно и быстро, я использовал его в нескольких проектах.
Лучшим вариантом является построение дерева выражений. Сначала вы строите дерево своего выражения, затем используйте http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx , затем вы можете легко скомпилировать его, используя http : //msdn.microsoft.com/en-us/library/bb356928 (v = VS.100) .aspx
Есть несколько интересных вариантов.
NCalc - парсер на C# Lexer, построенный с помощью ANTLR. Он разберет ваш текст и позволит вам присвоить значения параметрам / переменным. Интерпретатором является C#, поэтому вам не придется загружать дополнительные сборки в домен приложения и т.д.
JINT - интерпретатор Javascript на базе C#, созданный тем же автором ECalc с использованием ANTLR для создания грамматики. В настоящее время он находится в бета-версии, но хорошо работает с вычислениями и функциями.
CS-Script.Net - С сайта: "CS-Script - это система сценариев на основе CLR (Common Language Runtime), которая использует ECMA-совместимый C# в качестве языка программирования. CS-Script в настоящее время нацелена на реализацию CLR от Microsoft (.NET 2.0/3.0/3.5) с ограниченной поддержкой на Mono." Загрузка скриптов и создание сборок в памяти и отдельном домене приложений. Он довольно надежен, и я использую его в продакшене для встроенных сценариев.
NB: Этот ответ просто для полноты. Это определенно не тот подход, который я бы рекомендовал.
Существует возможность доступа к (устаревшим) библиотекам JScript непосредственно из C#, что означает, что вы можете использовать эквивалент функции eval
языка JScript.
using Microsoft.JScript; // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa; // needs a reference to Microsoft.Vsa.dll
// ...
string expr = "2 - 3 / 4 * 12";
Console.WriteLine(JScriptEval(expr)); // displays -7
// ...
public static VsaEngine _engine = VsaEngine.CreateEngine();
public static double JScriptEval(string expr)
{
// error checking etc removed for brevity
return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}
Определенно относится к категории "не рекомендуется", но для полноты картины - если у вас есть база данных, к которой можно удобно подключиться, отправьте ей запрос "SELECT expression".
Эээээээ, это кажется очень излишним решением.
На самом деле вам нужен простой синтаксический анализатор.
Вам нужно разбить строку на токены, а затем оценить их. Это поможет вам начать исследования. http://en.wikipedia.org/wiki/Parsing#Overview_of_process