Как я могу оценить математическое выражение, представленное строкой? - PullRequest
3 голосов
/ 11 февраля 2010

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

Ответы [ 6 ]

4 голосов
/ 11 февраля 2010

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

2 голосов
/ 11 февраля 2010

Вам понадобится какой-то математический парсер, чтобы сделать это. Ранее я использовал C # Expression Parser, используя RPN от DeepEddie , или вы можете сделать свой собственный, если сложность используемых вами выражений имеет более ограниченную область действия.

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

1 голос
/ 11 февраля 2010

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

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

0 голосов
/ 11 февраля 2010

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

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); 
                       }
                 }
              }";
  }
0 голосов
/ 11 февраля 2010

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

Microsoft.JScript.Eval.JScriptEvaluate

0 голосов
/ 11 февраля 2010

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

...