Как я могу оценить математическое выражение, представленное строкой?
-
20-09-2019 - |
Вопрос
Легко реализовать «калькулятор», чтобы проанализировать строку (например, 2 ^ 3 / 2
) и вычислить результат операций. Но есть ли библиотека, способная это сделать?
Решение
А дотмат Библиотека делает это.
Другие советы
Вам понадобится какой -то математический анализатор, чтобы сделать это. Я использовал C# SARSER SARSER с использованием RPN с DeepedDie Раньше, или вы можете сделать свой собственный, если сложность выражений, которые вы используете, имеет более ограниченный объем.
Не позволяйте этому пугать вас, на самом деле это довольно легко сделать.
Встроенный Ironpython в ваше приложение, вы можете попросить его оценить произвольно сложные строки
Я думаю, у них даже есть образец одного и того же
Проверить Обратная польская нотация. Анкет Широко используется в современных калькуляторах
Вы также можете использовать библиотеку JScript, хотя она устарела. Не говоря, что вы должны, просто что вы могли бы.
Я использовал это:
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;
public class JScriptEvaluator
{
public int EvalToInteger(string statement)
{
string s = EvalToString(statement);
return int.Parse(s.ToString());
}
public double EvalToDouble(string statement)
{
string s = EvalToString(statement);
return double.Parse(s);
}
public string EvalToString(string statement)
{
object o = "-1";
try
{
o= EvalToObject(statement);
}
catch { o = "-1"; }
return o.ToString();
}
public object EvalToObject(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}
public JScriptEvaluator()
{
CodeDomProvider provider = new Microsoft.JScript.JScriptCodeProvider();
CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results;
results = provider.CompileAssemblyFromSource(parameters, _jscriptSource);
Assembly assembly = results.CompiledAssembly;
_evaluatorType = assembly.GetType("Evaluator.Evaluator");
_evaluator = Activator.CreateInstance(_evaluatorType);
}
private object _evaluator = null;
private Type _evaluatorType = null;
private readonly string _jscriptSource =
@"package Evaluator
{
class Evaluator
{
public function Eval(expr : String) : String
{
return eval(expr);
}
}
}";
}