Pregunta

Es fácil implementar una "calculadora" para analizar una cadena (por ejemplo, 2 ^ 3 / 2) y calcule el resultado de las operaciones. Pero, ¿hay una biblioteca ya capaz de hacer esto?

¿Fue útil?

Solución

los dotmath La biblioteca hace esto.

Otros consejos

Necesitará algún tipo de analizador matemático para hacerlo. he usado C# Parser de expresión usando RPN por Deepeddie Antes, o podría hacer el suyo si la complejidad de las expresiones que usa es de alcance más limitado.

No dejes que te asuste, en realidad es bastante fácil de hacer.

Incrustar a Ironpython en su aplicación, puede pedirle que evalúe cadenas arbitrariamente complejas

Creo que incluso tienen una muestra de lo mismo

Verificar Notación de polaco inverso. Se usa ampliamente en calculadoras modernas

También puede usar la biblioteca JScript aunque está en desuso. No digo que deberías, solo que podrías.

Microsoft.jscript.eval.jscriptEvaluate

He usado esto:

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); 
                       }
                 }
              }";
  }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top