Wie kann ich einen mathematischen Ausdruck bewerten, der durch eine Zeichenfolge dargestellt wird?
-
20-09-2019 - |
Frage
Es ist einfach, einen "Taschenrechner" zu implementieren, um eine Zeichenfolge zu analysieren (z. 2 ^ 3 / 2
) und das Ergebnis von Operationen berechnen. Aber gibt es eine Bibliothek, die dies bereits tun kann?
Lösung
Das Dotmath Bibliothek tut dies.
Andere Tipps
Sie brauchen einen mathematischen Parser, um dies zu tun. Ich habe verwendet C# Expression Parser unter Verwendung von RPN von Deepteddie Vorher, oder Sie könnten Ihre eigenen machen, wenn die Komplexität der Ausdrücke, die Sie verwenden, von begrenztem Umfang sind.
Lass es dich nicht erschrecken, es ist eigentlich ziemlich einfach zu machen.
Einbetten Sie Ironpython in Ihre App ein, dann können Sie ihn bitten, willkürlich komplexe Zeichenfolgen zu bewerten
Ich denke, sie haben sogar eine Probe desselben
Kasse Polnische Notation umgekehrt. Es wird in modernen Taschenrechnern häufig verwendet
Sie können auch die Jscript -Bibliothek verwenden, obwohl sie veraltet ist. Ich sage nicht, dass du es sollte, nur dass du es könntest.
Ich habe das verwendet:
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);
}
}
}";
}