¿Cómo puedo evaluar una expresión matemática representada por una cadena?
-
20-09-2019 - |
Pregunta
Es fácil implementar una "calculadora" para analizar una cadena (por ejemplo, 2 ^ 3 / 2
) y calcule el resultado de las operaciones. Pero, ¿hay una biblioteca ya capaz de hacer esto?
Solución
los dotmath La biblioteca hace esto.
Otros consejos
Necesitará algún tipo de analizador matemático para hacerlo. he usado C# Parser de expresión usando RPN por Deepeddie Antes, o podría hacer el suyo si la complejidad de las expresiones que usa es de alcance más limitado.
No dejes que te asuste, en realidad es bastante fácil de hacer.
Incrustar a Ironpython en su aplicación, puede pedirle que evalúe cadenas arbitrariamente complejas
Creo que incluso tienen una muestra de lo mismo
Verificar Notación de polaco inverso. Se usa ampliamente en calculadoras modernas
También puede usar la biblioteca JScript aunque está en desuso. No digo que deberías, solo que podrías.
He usado esto:
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);
}
}
}";
}