【问题标题】:c# calculate multiple calculations from a string [duplicate]c#从一个字符串计算多个计算[重复]
【发布时间】:2016-06-24 08:18:51
【问题描述】:

我正在用 c# (winforms) 制作一个计算器,我想知道是否有一种简单的方法来计算一个包含多个计算的字符串,例如:如果你有字符串 "124+241/2*5" 让程序计算它然后得到一个 int 输出。

提前致谢。

【问题讨论】:

  • 要考虑两件事:a) 是 124+241/2*5 = (124+241)/2*5 还是 124+(241/2*5)? b)无论哪种方式,结果都不是整数,您希望 int 是什么?围捕?圆下来?错误?

标签: c# .net winforms calculator


【解决方案1】:

嗯,您基本上是在寻找 Javascript 的 eval() 函数的 C# 等效项。

我推荐图书馆NCalc

var result = new Expression("124+241/2*5").Evaluate()

另一个计算引擎是Jace.NET

Dictionary<string, double> variables = new Dictionary<string, double>();
variables.Add("var1", 2.5);
variables.Add("var2", 3.4);

CalculationEngine engine = new CalculationEngine();
double result = engine.Calculate("var1*var2", variables);

还有Dynamic Expresso

var result = new Interpreter().Eval("124+241/2*5");

您可以使用Roslyn's ScriptingEngine 来评估:

Roslyn.Scripting.Session session = roslynEngine.CreateSession();
session.Execute("124+241/2*5");

【讨论】:

    【解决方案2】:

    嗯,“简单”实际上是一个相当宽泛的术语……我应该说是相对的。无论如何,有一些库已经证明自己非常健壮,并且在诸如此类的事情上非常受欢迎。

    第一个是NCALChttp://ncalc.codeplex.com/):

    // One of the examples.
    Expression e = new Expression("2 + 3 * 5");
    

    第二个是Jace.NEThttps://github.com/pieterderycke/Jace):

    // One of the examples.
    CalculationEngine engine = new CalculationEngine();
    Func<Dictionary<string, double>, double> formula = engine.Build("var1+2/(3*otherVariable)");
    
    Dictionary<string, double> variables = new Dictionary<string, double>();
    variables.Add("var1", 2);
    variables.Add("otherVariable", 4.2);
    
    double result = formula(variables);
    

    两者都很棒,但根据以前的经验,我发现 Jace.NET 在更复杂的表达式上表现更好(在这里对你来说应该不是问题)。

    【讨论】:

      【解决方案3】:

      没有自动的方法来做到这一点,您要么必须手动解析它,要么使用与 JavaScript 的 eval() 等效的某种功能。

      不需要使用外部库的一个不错的选择是System.Data.DataTable.Compute

      public double Evaluate(string expr)
      {
          System.Data.DataTable table = new System.Data.DataTable();
          return Convert.ToDouble(table.Compute(expr, String.Empty));
      }
      

      【讨论】:

        【解决方案4】:

        CodeDom 和 Reflection 使您能够将 C# 代码动态地构建成字符串、编译它并在程序中全部运行。 .NET 中这个非常强大的功能允许我们创建 CodeDom 计算器,这是一个计算 Windows 窗体中的表达式(甚至是 C# 代码行)的计算器。

        http://www.c-sharpcorner.com/UploadFile/mgold/CodeDomCalculator08082005003253AM/CodeDomCalculator.aspx

        【讨论】:

          【解决方案5】:

          如果我没听错的话,你需要这样的东西:Dynamic Expresso 您可以使用 NuGet 将其添加到您的程序中

          【讨论】:

            猜你喜欢
            • 2015-07-08
            • 2017-09-03
            • 2014-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-14
            • 1970-01-01
            相关资源
            最近更新 更多