2010-02-11 6 views
3

"Calculator"를 구현하여 문자열 (예 : 2^3/2)을 파싱하고 연산 결과를 계산하기 쉽습니다. 그러나 이미이 작업을 수행 할 수있는 라이브러리가 있습니까? 앱에서문자열로 표시된 수학 표현식을 평가하려면 어떻게해야합니까?

+1

당신은 의미합니까 (2^3)/2^(3/2) 2? – Gumbo

+0

컴파일 된 언어 C#은 eval 함수를 가지고 있지 않다. (예를 들어 perl과 다르다) –

+1

'3을 2로 나눈 값'또는 '2 XOR 3을 나눈 값 2? – Earlz

답변

4

dotMath 라이브러리가이 작업을 수행의 샘플을 생각 임의의 복잡한 문자열

을 평가하도록 요청할 수 있습니다.

+1

Flee도 옵션처럼 보입니다. http://www.codeplex.com/Flee –

+0

+1 :이 라이브러리를 사용했고 매우 효과적입니다. –

1

임베드 IronPython을, 당신은 내가 그들도 같은 일

2

이렇게하려면 일종의 수학 파서가 필요합니다. 이전에 C# Expression Parser using RPN by DeepEddie을 사용했거나 사용하는 표현의 복잡성이 더 제한적인 경우에는 직접 만들 수도 있습니다.

두려워하지 마십시오. 실제로 만드는 것은 꽤 쉽습니다.

+0

매우 간단한 경우에만 "쉽다" –

+1

대부분의 경우 경향이 있습니다. 그것이 더 간단 할 때 더 쉬워진다. –

+1

난 그냥 입력 문자열을 구문 분석 계산기를 작성하는 명백한 쉬운 거짓말을 의미합니다. 실제로는 사소한 문제입니다. 날 믿지 않으면 해봐. –

0

체크 아웃 Reverse Polish notation을 확인하십시오. 현대 계산기에서 널리 사용됩니다.

+1

이것이 도움이되는 방법을 모르겠다. OP는 기존 라이브러리를 찾고 자신의 파서를 구현하지 않을 것입니다 (따라서 바퀴를 재발 명합니다). –

+0

그러나 찾고있는 것의 이름을 알고 있으면 도움이 될 수 있습니다. –

0

내가 이것을 사용하고 있습니다 :

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); 
         } 
       } 
       }"; 
    } 
관련 문제