Математический калькулятор C# [дубликат]

7 ответов

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 .

65
ответ дан 28 November 2019 в 22:18
поделиться

Ознакомьтесь с FLEE (Fast Lightweight Expression Evaluator) - http://flee.codeplex.com/

Flee - это синтаксический анализатор и вычислитель выражений для платформы .NET. Он позволяет вычислять значение строковых выражений, таких как sqrt (a ^ 2 + b ^ 2) во время выполнения. Он использует настраиваемый компилятор, строго типизированный язык выражений и легкий кодогенератор для компиляции выражений непосредственно в IL. Это означает, что вычисление выражений происходит очень быстро и эффективно. Попробуйте демонстрацию, которая позволяет вам создавать изображения на основе выражений, и убедитесь в этом сами.

Это бесплатно и быстро, я использовал его в нескольких проектах.

4
ответ дан 28 November 2019 в 22:18
поделиться

Лучшим вариантом является построение дерева выражений. Сначала вы строите дерево своего выражения, затем используйте http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx , затем вы можете легко скомпилировать его, используя http : //msdn.microsoft.com/en-us/library/bb356928 (v = VS.100) .aspx

0
ответ дан 28 November 2019 в 22:18
поделиться

Есть несколько интересных вариантов.

  1. NCalc - парсер на C# Lexer, построенный с помощью ANTLR. Он разберет ваш текст и позволит вам присвоить значения параметрам / переменным. Интерпретатором является C#, поэтому вам не придется загружать дополнительные сборки в домен приложения и т.д.

  2. JINT - интерпретатор Javascript на базе C#, созданный тем же автором ECalc с использованием ANTLR для создания грамматики. В настоящее время он находится в бета-версии, но хорошо работает с вычислениями и функциями.

  3. CS-Script.Net - С сайта: "CS-Script - это система сценариев на основе CLR (Common Language Runtime), которая использует ECMA-совместимый C# в качестве языка программирования. CS-Script в настоящее время нацелена на реализацию CLR от Microsoft (.NET 2.0/3.0/3.5) с ограниченной поддержкой на Mono." Загрузка скриптов и создание сборок в памяти и отдельном домене приложений. Он довольно надежен, и я использую его в продакшене для встроенных сценариев.

8
ответ дан 28 November 2019 в 22:18
поделиться

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());
}
3
ответ дан 28 November 2019 в 22:18
поделиться

Определенно относится к категории "не рекомендуется", но для полноты картины - если у вас есть база данных, к которой можно удобно подключиться, отправьте ей запрос "SELECT expression".

3
ответ дан 28 November 2019 в 22:18
поделиться

Эээээээ, это кажется очень излишним решением.

На самом деле вам нужен простой синтаксический анализатор.

Вам нужно разбить строку на токены, а затем оценить их. Это поможет вам начать исследования. http://en.wikipedia.org/wiki/Parsing#Overview_of_process

0
ответ дан 28 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: