문자열로 표시되는 수학 표현식을 어떻게 평가할 수 있습니까?

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

  •  20-09-2019
  •  | 
  •  

문제

문자열을 구문 분석하기 위해 "계산기"를 구현하기 쉽습니다 (예 : 2 ^ 3 / 2) 및 운영 결과를 계산하십시오. 그러나 이미이를 수행 할 수있는 도서관이 있습니까?

도움이 되었습니까?

해결책

그만큼 도트 마스 도서관은 이것을합니다.

다른 팁

그렇게하려면 일종의 수학 파서가 필요할 것입니다. 나는 사용했다 C# Destreddie의 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