Doubles possibles:
Existe-t-il un évaluateur de mathématiques en chaîne dans .NET?
Conversion de l'expression de chaîne en valeur entière à l'aide de C #
Meilleure et la plus courte des méthodes d'évaluation des expressions mathématiques
c # chaîne d'évaluation “3 * (4 + 2)” rendement int 18
Existe-t-il un moyen de calculer des expressions mathématiques telles que (2-3/4 * 12) d’une manière différente de celle présentée ici?
DataTable a une méthode Compute qui vous permet d'écrire ceci:
var result = new DataTable().Compute("2-3/4*12", null);
Notez que cela est limité aux expressions mathématiques simples.
Une autre option consiste à utiliser un langage dynamique dans le DLR tel que IronPython et IronRuby. Check-out ce post :
var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");
Vous pouvez également consulter la bibliothèque NCalc sur GitHub .
Certaines options intéressantes s'offrent à vous.
NCalc - un analyseur Lexer C # construit avec ANTLR . Cela analysera votre texte et vous permettra d’attribuer des valeurs aux paramètres/variables. L'interprète est en C #, vous n'avez donc pas besoin de charger d'autres assemblys dans un domaine d'application, etc.
JINT - - un interpréteur Javascript basé sur C # construit par le même auteur d'ECalc utilisant ANTLR pour créer la grammaire. Ceci est actuellement en version bêta mais fonctionne bien avec les calculs et les fonctions.
CS-Script.Net - Depuis le site: "CS-Script est un système de script basé sur le CLR (Common Language Runtime) qui utilise un langage de programmation conforme à la norme ECMA. # CS-Script vise actuellement .NET 2.0/3.0/3.5) avec un support limité sur Mono. " Les scripts de chargement et créer des assemblys en mémoire et séparer le domaine de l'application. Il est assez robuste et je l’utilise en production pour les scripts intégrés.
Découvrez FLEE (évaluateur d’expression rapide et légère) - http://flee.codeplex.com/
Flee est un analyseur et un évaluateur d’expression pour le framework .NET. Il vous permet de calculer la valeur d'expressions de chaîne telles que sqrt (a ^ 2 + b ^ 2) au moment de l'exécution. Il utilise un compilateur personnalisé, un langage d'expression fortement typé et un codegen léger pour compiler les expressions directement en IL. Cela signifie que l'évaluation de l'expression est extrêmement rapide et efficace. Essayez la démo, qui vous permet de générer des images basées sur des expressions, et voyez par vous-même.
C'est gratuit et rapide et je l'ai utilisé dans plusieurs projets.
Certainement dans la catégorie "ne recommande pas", mais pour être complet - si vous avez une base de données à laquelle vous pouvez facilement vous connecter, envoyez-lui la requête "SELECT expression ".
NB: Cette réponse est juste pour être complet. Ce n'est certainement pas une approche que je recommanderais.
Il est possible d'accéder aux bibliothèques JScript (obsolètes) directement à partir de C #, ce qui signifie que vous pouvez utiliser l'équivalent de la fonction eval
de JScript.
using Microsoft.JScript; // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa; // needs a reference to Microsoft.Vsa.dll
// ...
string expr = "2 - 3 / 4 * 12";
Console.WriteLine(JScriptEval(expr)); // displays -7
// ...
public static VsaEngine _engine = VsaEngine.CreateEngine();
public static double JScriptEval(string expr)
{
// error checking etc removed for brevity
return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}
Euh, cela semble être une solution très exagérée.
Ce que vous voulez vraiment, c'est un simple analyseur.
Vous devez diviser la chaîne en jetons, puis les évaluer. Cela vous permettra de commencer vos recherches. http://en.wikipedia.org/wiki/Parsing#Overview_of_process
la meilleure option consiste à créer un arbre d’expression. Vous construisez d’abord une arborescence de votre expression, puis utilisez http://msdn.Microsoft.com/en-us/library/system.linq.expressions.aspx vous pouvez le compiler puis utilisez facilement http : //msdn.Microsoft.com/en-us/library/bb356928 (v = VS.100) .aspx