Как я могу оценить математическое выражение, представленное строкой?

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

  •  20-09-2019
  •  | 
  •  

Вопрос

Легко реализовать «калькулятор», чтобы проанализировать строку (например, 2 ^ 3 / 2) и вычислить результат операций. Но есть ли библиотека, способная это сделать?

Это было полезно?

Решение

А дотмат Библиотека делает это.

Другие советы

Вам понадобится какой -то математический анализатор, чтобы сделать это. Я использовал C# SARSER SARSER с использованием RPN с DeepedDie Раньше, или вы можете сделать свой собственный, если сложность выражений, которые вы используете, имеет более ограниченный объем.

Не позволяйте этому пугать вас, на самом деле это довольно легко сделать.

Встроенный Ironpython в ваше приложение, вы можете попросить его оценить произвольно сложные строки

Я думаю, у них даже есть образец одного и того же

Проверить Обратная польская нотация. Анкет Широко используется в современных калькуляторах

Вы также можете использовать библиотеку JScript, хотя она устарела. Не говоря, что вы должны, просто что вы могли бы.

Microsoft.jscript.eval.jscriptevaluate

Я использовал это:

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); 
                       }
                 }
              }";
  }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top