Comment puis-je évaluer une expression mathématique représentée par une chaîne?

StackOverflow https://stackoverflow.com/questions/2246498

  •  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?

Était-ce utile?

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.

Microsoft.JScript.Eval.JScriptEvaluate

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); 
                       }
                 }
              }";
  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top