【问题标题】:How can I evaluate a math expression represented by a string?如何评估由字符串表示的数学表达式?
【发布时间】:2010-02-11 18:01:23
【问题描述】:

很容易实现“计算器”来解析字符串(例如,2 ^ 3 / 2)并计算运算结果。但是,是否有图书馆已经能够做到这一点?

【问题讨论】:

  • 你的意思是 (2^3)/2 还是 2^(3/2)?
  • 这不会那么容易,因为作为编译语言 c# 没有 eval 函数(例如不像 perl)
  • 你的意思是2 to the power of 3 divided by 2还是2 XOR 3 divided by 2
  • 我的意思是“2 的 3 除以 2”,但“2 XOR 3 除以 2”也不错!尽管如此,这只是一个示例,只是为了使标题看起来不错。 :)

标签: c# expression-evaluation


【解决方案1】:

dotMath 库执行此操作。

【讨论】:

    【解决方案2】:

    您需要某种数学解析器才能做到这一点。我以前用过C# Expression Parser using RPN by DeepEddie,如果你使用的表达式的复杂性范围更有限,你也可以自己制作。

    别吓到你,其实做起来很简单。

    【讨论】:

    • 只有在非常简单的情况下才“简单”
    • 大多数事情越简单,就越容易。
    • 我的意思是,编写一个解析输入字符串的计算器显然很容易是具有欺骗性的。这实际上是一个不平凡的问题。如果你不相信我,试试看。
    【解决方案3】:

    在您的应用程序中嵌入 Ironpython,然后您可以要求它评估任意复杂的字符串

    我认为他们甚至有相同的样本

    【讨论】:

      【解决方案4】:

      查看Reverse Polish notation。广泛用于现代计算器

      【讨论】:

      • 我看不出这有什么帮助。 OP 正在寻找一个现有的库,而不是希望实现自己的解析器(从而重新发明轮子)
      • 但是知道你要找的东西的名字会很有帮助。
      【解决方案5】:

      您也可以使用 JScript 库,尽管它已被弃用。不是说你应该,只是你可以。

      Microsoft.JScript.Eval.JScriptEvaluate

      【讨论】:

        【解决方案6】:

        我用过这个:

        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); 
                               }
                         }
                      }";
          }
        

        【讨论】:

          猜你喜欢
          • 2012-05-29
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多