109 votes

Existe-t-il un évaluateur mathématique de chaîne dans .NET ?

Si j'ai une chaîne de caractères avec une expression mathématique valide telle que :

String s = "1 + 2 * 7";

Existe-t-il une bibliothèque/fonction intégrée dans .NET qui analyse et évalue cette expression pour moi et renvoie le résultat ? Dans ce cas, 15.

2 votes

Il n'y en a pas d'intégré. Mais il en existe un assez complet aquí .

1 votes

Vous pouvez utiliser L'évaluateur d'expression (Fonction d'évaluation dans un environnement .NET 100% géré)

95voto

Tim Schmelter Points 163781

Il est étrange que cette fameuse et ancienne question n'ait pas une réponse qui suggère que le builtin DataTable.Compute - "truc". C'est ici.

double result = Convert.ToDouble(new DataTable().Compute("1 + 2 * 7", null));

Les opérateurs arithmétiques suivants sont pris en charge dans les expressions :

+ (addition)
- (subtraction)
* (multiplication)
/ (division)
% (modulus)

Plus d'informations : DataColumn.Expression à l'adresse Syntaxe de l'expression .

0 votes

Il y a eu une réponse de ma81xx le 15 novembre '11

1 votes

Vous avez raison, mais ce n'était pas en utilisant la méthode Compute.

0 votes

Votre exemple me donne System.InvalidCastException was unhandled by user code HResult=-2147467262 Comment puis-je le corriger ?

57voto

user21826 Points 1048

Vous pourriez ajouter une référence à la bibliothèque de contrôle Microsoft script (COM) et utiliser un code comme celui-ci pour évaluer une expression. (Cela fonctionne également pour JScript).

Dim sc As New MSScriptControl.ScriptControl()
sc.Language = "VBScript"
Dim expression As String = "1 + 2 * 7"
Dim result As Double = sc.Eval(expression)

Modifier - Version C#.

MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControl();
sc.Language = "VBScript";
string expression = "1 + 2 * 7";
object result = sc.Eval(expression);            
MessageBox.Show(result.ToString());

Modifier - Le ScriptControl est un objet COM. Dans le dialogue "Add reference" du projet, sélectionnez l'onglet "COM" et descendez jusqu'à "Microsoft script Control 1.0" et sélectionnez ok.

4 votes

Bien que cette réponse soit indiquée, elle date d'il y a 10 ans et COM est en quelque sorte mort aujourd'hui. Je préfère la réponse DataTable.Compute ci-dessous.

30voto

GreyCloud Points 1521

Avez-vous vu http://ncalc.codeplex.com ?

Il est extensible, rapide (par exemple, il possède son propre cache) et vous permet de fournir des fonctions personnalisées et des variables au moment de l'exécution en traitant les événements EvaluateFunction/EvaluateParameter. Exemples d'expressions qu'il peut analyser :

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

  e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
  e.Parameters["X"] = 10; 

  e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
      if (name == "Pi") 
      args.Result = 3.14; 
    }; 

  Debug.Assert(117.07 == e.Evaluate()); 

Il gère également l'unicode et de nombreux types de données de manière native. Il est livré avec un fichier de bois si vous voulez changer la grammaire. Il existe également un fork qui supporte MEF pour charger de nouvelles fonctions.

1 votes

Grande bibliothèque. Également disponible sur NUGET

0 votes

C'est ce que j'ai utilisé pour mon solveur d'équations différentielles qui prenait l'entrée d'un utilisateur. La question est aquí

28voto

Guy Points 16718

Pour tous ceux qui développent en C# sur Silverlight, voici une astuce très intéressante que je viens de découvrir et qui permet d'évaluer une expression en faisant appel au moteur Javascript :

double result = (double) HtmlPage.Window.Eval("15 + 35");

0 votes

Je me demande si vous pouvez le référencer ailleurs. Probablement pas, mais ce serait cool.

4 votes

Comme cette fonction évalue un code Javascript arbitraire, vous voudrez sans doute vous assurer que vos entrées sont sécurisées et que vous n'affichez pas directement le résultat. (Je pense que c'est un bon moyen d'introduire du XSS sans s'en rendre compte).

0 votes

Essayez de saisir des chiffres avec un zéro en tête, le résultat n'est pas fiable. "054 + 6" vous donne 50 par exemple.

15voto

cbp Points 9676

En fait, il y a une sorte d'intégration - vous pouvez utiliser l'espace de noms XPath ! Bien que cela nécessite de reformater la chaîne de caractères pour la confirmer avec la notation XPath. J'ai utilisé une méthode comme celle-ci pour gérer des expressions simples :

    public static double Evaluate(string expression)
    {
        var xsltExpression = 
            string.Format("number({0})", 
                new Regex(@"([\+\-\*])").Replace(expression, " ${1} ")
                                        .Replace("/", " div ")
                                        .Replace("%", " mod "));

        return (double)new XPathDocument
            (new StringReader("<r/>"))
                .CreateNavigator()
                .Evaluate(xsltExpression);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X