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

Математический калькулятор С#

Возможные дубликаты:
Есть ли математический оценщик строк в .NET?
Преобразование строкового выражения в Integer Value с использованием С#
Лучший и самый короткий способ оценки математических выражений
С#, оценивающая строку "3 * (4 + 2)" yield int 18

Есть ли способ вычислить математические выражения типа (2-3/4 * 12) по-другому, чем представлен здесь?

http://www.c-sharpcorner.com/uploadfile/mgold/codedomcalculator08082005003253am/codedomcalculator.aspx

4b9b3361

Ответ 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