Математический калькулятор С#
Возможные дубликаты:
Есть ли математический оценщик строк в .NET?
Преобразование строкового выражения в Integer Value с использованием С#
Лучший и самый короткий способ оценки математических выражений
С#, оценивающая строку "3 * (4 + 2)" yield int 18
Есть ли способ вычислить математические выражения типа (2-3/4 * 12) по-другому, чем представлен здесь?
http://www.c-sharpcorner.com/uploadfile/mgold/codedomcalculator08082005003253am/codedomcalculator.aspx
Ответы
Ответ 1
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.
Ответ 2
Есть несколько интересных вариантов, доступных вам.
-
NCalc - С# Lexer Parser, построенный с ANTLR. Это проанализирует ваш текст и позволит вам присваивать значения параметрам/переменным. Интерпретатором является С#, поэтому вам не нужно загружать дополнительные сборки в домене приложений и т.д.
-
JINT - интерпретатор Javascript на С#, построенный тем же автором ECalc с использованием ANTLR для создания грамматики. Это в настоящее время находится в стадии бета-тестирования, но хорошо работает с вычислениями и функциями.
-
CS- Script.Net - С сайта: "CS- Script - это CLR (Common Language Runtime), использующая ECMA-совместимый С# в качестве языка программирования. CS- Script в настоящее время нацелен на реализацию Microsoft CLR (.NET 2.0/3.0/3.5) с ограниченной поддержкой Mono". Загружает скрипты и создает сборки в памяти и отдельный домен приложения. Он довольно надежный, и я использую его для создания встроенных скриптов.
Ответ 3
Отъезд FLEE (Оценщик экспресс-оценки с легким весом) - http://flee.codeplex.com/
Flee является парсером выражения и оценщиком для платформы .NET. Он позволяет вам вычислить значение строковых выражений, таких как sqrt (a ^ 2 + b ^ 2) во время выполнения. Он использует собственный компилятор, строго типизированный язык выражения и легкий код для компиляции выражений непосредственно в IL. Это означает, что оценка экспрессии очень быстро и эффективно. Попробуйте демонстрацию, которая позволяет создавать изображения на основе выражений и видеть сами.
Это бесплатно и быстро, и я использовал его в нескольких проектах.
Ответ 4
NB: Этот ответ предназначен только для полноты. Это определенно не тот подход, который я бы рекомендовал.
Можно получить доступ к (устаревшим) библиотекам JScript непосредственно из С#, что означает, что вы можете использовать эквивалент функции JScript eval
.
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());
}
Ответ 5
Определенно в категории "не рекомендуется", но для полноты - если у вас есть база данных, к которой вы можете удобно подключиться, отправьте запрос "SELECT expression".
Ответ 6
Uh, похожее на верхнее решение.
То, что вы действительно хотите, это простой парсер.
Вам нужно разбить строку на токены и затем оценить их. Это поможет вам начать исследования.
http://en.wikipedia.org/wiki/Parsing#Overview_of_process
Ответ 7
Лучший вариант - построить дерево выражений. Сначала вы создаете дерево своего выражения, затем используйте http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx, вы можете легко скомпилировать его, используя http://msdn.microsoft.com/en-us/library/bb356928(v=VS.100).aspx