Pergunta

É fácil implementar uma "calculadora" para analisar uma string (por exemplo, 2 ^ 3 / 2) e calcule o resultado de operações. Mas, já existe uma biblioteca capaz de fazer isso?

Foi útil?

Solução

o Dotmath Biblioteca faz isso.

Outras dicas

Você precisará de algum tipo de analisador de matemática para fazer isso. Eu usei Analisador de expressão c# usando RPN por DeepDdie Antes, ou você poderá fazer o seu próprio se a complexidade das expressões que você usa for de escopo mais limitado.

Não deixe que isso o assuste, é realmente muito fácil de fazer.

Incorpore o IronPython em seu aplicativo, você pode solicitar que ele avalie strings arbitrariamente complexos

Eu acho que eles até têm uma amostra da mesma coisa

Verificação de saída Notação polonesa reversa. É amplamente utilizado em calculadoras modernas

Você também pode usar a biblioteca JScript, embora esteja presa. Não estou dizendo que você deveria, apenas que poderia.

Microsoft.jscript.eval.jscriptEvaluate

Eu usei isso:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top