Comment puis-je évaluer une expression mathématique représentée par une chaîne?
-
20-09-2019 - |
Question
Il est facile de mettre en œuvre une « calculatrice » pour analyser une chaîne (par exemple, 2 ^ 3 / 2
) et calculer le résultat des opérations. Mais, est-il une bibliothèque déjà capable de le faire?
La solution
La bibliothèque dotMath le fait.
Autres conseils
Vous allez avoir besoin d'une sorte d'analyseur de mathématiques afin de le faire. Je l'ai utilisé C # Expression Parser en utilisant RPN par DeepEddie avant, ou vous pouvez faire votre propre si la complexité des expressions que vous utilisez sont de portée plus limitée.
Ne le laissez pas vous faire peur, il est en fait assez facile à faire.
intégrer IronPython dans votre application, vous pouvez alors demander d'évaluer les chaînes arbitrairement complexes
Je pense qu'ils ont même un échantillon de la même chose
Consultez inverse notation polonaise. Il est largement utilisé dans les calculatrices modernes
Vous pouvez également utiliser la bibliothèque JScript bien que son dépréciée. Ne dis pas qu'il devrait, juste que vous pourriez.
Je l'ai utilisé ceci:
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);
}
}
}";
}