C# вычислить несколько вычислений из строки
Я делаю калькулятор в C# (winforms), и мне было интересно, есть ли простой способ вычислить строку с несколькими вычислениями в нем, например, если у вас есть строка "124+241/2*5"
позвольте программе вычислить это и затем получить выходной int.
Заранее спасибо.
5 ответов
Ну, вы в основном ищете C# эквивалент Javascript eval()
функция.
Я рекомендую библиотеку NCalc.
var result = new Expression("124+241/2*5").Evaluate()
Другим вычислительным движком будет Jace.NET.
Dictionary<string, double> variables = new Dictionary<string, double>();
variables.Add("var1", 2.5);
variables.Add("var2", 3.4);
CalculationEngine engine = new CalculationEngine();
double result = engine.Calculate("var1*var2", variables);
Также есть Dynamic Expresso.
var result = new Interpreter().Eval("124+241/2*5");
И вы можете использовать Roslyn's ScriptingEngine для оценки:
Roslyn.Scripting.Session session = roslynEngine.CreateSession();
session.Execute("124+241/2*5");
Ну, на самом деле "простой" - это довольно широкий термин... относительный, я бы сказал. В любом случае, есть несколько библиотек, которые зарекомендовали себя как очень надежные и очень популярные для таких вещей, как эта.
Первый - это NCALC ( http://ncalc.codeplex.com/):
// One of the examples.
Expression e = new Expression("2 + 3 * 5");
Второй - Jace.NET ( https://github.com/pieterderycke/Jace):
// One of the examples.
CalculationEngine engine = new CalculationEngine();
Func<Dictionary<string, double>, double> formula = engine.Build("var1+2/(3*otherVariable)");
Dictionary<string, double> variables = new Dictionary<string, double>();
variables.Add("var1", 2);
variables.Add("otherVariable", 4.2);
double result = formula(variables);
Оба фантастические, но из предыдущего опыта я обнаружил, что Jace.NET работает немного лучше на более сложных выражениях (для вас это не должно быть проблемой).
Если я вас правильно понимаю, вам нужно что-то подобное: Dynamic Expresso. Вы можете добавить это в свою программу с помощью NuGet.
Не существует автоматического способа сделать это, вам придется либо анализировать его вручную, либо использовать какую-то функциональность, эквивалентную JavaScript eval()
,
Хорошая альтернатива, которая не требует использования внешних библиотек System.Data.DataTable.Compute
:
public double Evaluate(string expr)
{
System.Data.DataTable table = new System.Data.DataTable();
return Convert.ToDouble(table.Compute(expr, String.Empty));
}
CodeDom и Reflection дают вам возможность динамически встраивать C# -код в строку, компилировать и запускать все это внутри вашей программы. Эта очень мощная функция в.NET позволяет нам создавать калькулятор CodeDom, калькулятор, который оценивает выражения (и даже строки кода C#) внутри формы Windows.