C # calculatrice mathématique [dupliquer]
duplicata possibles:
y a-t-il un évaluateur de mathématiques des cordes dans. NET?
conversion de l'expression de la chaîne en valeur entière en utilisant C#
la meilleure et la plus courte façon d'évaluer les expressions mathématiques
c # evaluating string "3*(4+2)" yield int 18
est-il possible de calculer des expressions mathématiques comme (2-3/4*12) d'une manière différente de celle présentée ici?
7 réponses
DataTable a un calculer méthode qui vous permet d'écrire ceci:
var result = new DataTable().Compute("2-3/4*12", null);
notez que ceci est limité aux expressions mathématiques simples.
une autre option consiste à utiliser un langage dynamique dans le DLR comme 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 .
il y a des options intéressantes à votre disposition.
-
NCalc - A C# Lexer Parser construit avec ANTLR . Cela analysera votre texte et vous permettra d'assigner des valeurs à des paramètres / variables. L'interpréteur est C#, donc vous n'avez pas à charger des assemblages supplémentaires dans un domaine app, etc.
-
JINT - un C# en fonction Interpréteur Javascript créé par le même auteur de ECalc en utilisant ANTLR pour créer la grammaire. Il est actuellement en version bêta, mais fonctionne bien avec les calculs et les fonctions.
-
CS-Script.Net -du site: "CS-Script is a CLR (Common Language Runtime) based scripting system which uses ECMA-compliant c# as a programming language. CS-Script cible actuellement la mise en œuvre de CLR par Microsoft (.NET 2.0/3.0/3.5) avec des support sur Mono."Chargez les scripts et créez des assemblages en mémoire et séparez le domaine app. Il est assez robuste, et je l'utilise en production pour les scripts intégrés.
découvrez FUIR (Rapide Léger Évaluateur d'Expression) - http://flee.codeplex.com/
Flee est un analyseur et un évaluateur d'expressions pour le .net framework. Il vous permet de calculer la valeur des expressions de chaîne telles que sqrt(a^2 + b^2) à l'exécution. Il utilise un compilateur personnalisé, un langage d'expression fortement typé et un codegen léger pour compiler des expressions directement vers 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 quelques projets.
NB: cette réponse est seulement pour être complète. Ce n'est certainement pas une approche que je recommande.
il est possible d'accéder aux bibliothèques JScript (dépréciées) directement depuis 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());
}
certainement dans la catégorie" ne recommande pas", mais par souci d'exhaustivité -- si vous avez une base de données à laquelle vous pouvez vous connecter commodément, envoyez-lui la requête "SELECT expression ".
ça semble être une solution très exagérée.
Ce que vous voulez vraiment est un simple analyseur.
vous devez briser la chaîne en jetons et ensuite les évaluer. Cela vous permettra de commencer la recherche. http://en.wikipedia.org/wiki/Parsing#Overview_of_process
la meilleure option est de construire un arbre D'Expression. Vous construisez d'abord l'arbre de votre expression, puis utilisez http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx vous pouvez le compiler facilement en utilisant http://msdn.microsoft.com/en-us/library/bb356928 (v = VS.100).aspx