文字列で表される数学式を評価するにはどうすればよいですか?

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

  •  20-09-2019
  •  | 
  •  

質問

文字列を解析するために「計算機」を実装するのは簡単です(例: 2 ^ 3 / 2)および操作の結果を計算します。しかし、すでにこれを行うことができるライブラリはありますか?

役に立ちましたか?

解決

ドットマス 図書館はこれを行います。

他のヒント

それを行うには、ある種の数学パーサーが必要になります。私は使用しました deepeddieによるRPNを使用したC#表現パーサー 以前は、使用する表現の複雑さがより限られた範囲である場合、自分で作ることができます。

それがあなたを怖がらせないでください、それは実際に作るのは非常に簡単です。

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