Come posso valutare un'espressione matematica rappresentato da una stringa?
-
20-09-2019 - |
Domanda
E 'facile da implementare una "calcolatrice" per analizzare una stringa (ad esempio, 2 ^ 3 / 2
) e calcolare il risultato delle operazioni. Ma, c'è una libreria già in grado di fare questo?
Soluzione
Il dotMath biblioteca fa questo.
Altri suggerimenti
Si sta andando ad avere bisogno di un qualche tipo di matematica parser per farlo. Ho usato C # Parser Espressione usando RPN da DeepEddie prima, o si potrebbe fare il vostro proprio se la complessità delle espressioni che si utilizzano sono di portata più limitata.
Non lasciatevi spaventare, in realtà è abbastanza facile da fare.
IronPython incorporare nella vostra applicazione, si può quindi chiedere di valutare le stringhe arbitrariamente complesse
penso che hanno anche un campione della stessa cosa
Reverse Polish Notation . E 'ampiamente utilizzato in calcolatrici moderne
È inoltre possibile utilizzare la libreria JScript anche se la sua deprecato. Non dicendo che si dovrebbe, solo che si poteva.
Ho usato questo:
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);
}
}
}";
}