Wie kann ich einen mathematischen Ausdruck bewerten, der durch eine Zeichenfolge dargestellt wird?

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

  •  20-09-2019
  •  | 
  •  

Frage

Es ist einfach, einen "Taschenrechner" zu implementieren, um eine Zeichenfolge zu analysieren (z. 2 ^ 3 / 2) und das Ergebnis von Operationen berechnen. Aber gibt es eine Bibliothek, die dies bereits tun kann?

War es hilfreich?

Lösung

Das Dotmath Bibliothek tut dies.

Andere Tipps

Sie brauchen einen mathematischen Parser, um dies zu tun. Ich habe verwendet C# Expression Parser unter Verwendung von RPN von Deepteddie Vorher, oder Sie könnten Ihre eigenen machen, wenn die Komplexität der Ausdrücke, die Sie verwenden, von begrenztem Umfang sind.

Lass es dich nicht erschrecken, es ist eigentlich ziemlich einfach zu machen.

Einbetten Sie Ironpython in Ihre App ein, dann können Sie ihn bitten, willkürlich komplexe Zeichenfolgen zu bewerten

Ich denke, sie haben sogar eine Probe desselben

Kasse Polnische Notation umgekehrt. Es wird in modernen Taschenrechnern häufig verwendet

Sie können auch die Jscript -Bibliothek verwenden, obwohl sie veraltet ist. Ich sage nicht, dass du es sollte, nur dass du es könntest.

Microsoft.jscript.eval.jscriptevaluate

Ich habe das verwendet:

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); 
                       }
                 }
              }";
  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top