【问题标题】:Compute string as an arithmetic operation [duplicate]将字符串计算为算术运算[重复]
【发布时间】:2016-08-16 20:00:14
【问题描述】:

我有一个字符串,其中包含由加法、减法、乘法、除法符号等分隔的数字,例如:

"1+2*3"="7"

符号的最大数量可以是两个。我想将此字符串计算为算术运算。我怎样才能做到这一点?我目前的想法是将这个字符串拆分成一个列表,然后使用算术运算的正常顺序计算结果。

【问题讨论】:

  • 请您发布您到目前为止所尝试的内容...
  • 你真的不希望它出现在列表中。一个简单而有效的方法是使用 Shutting Yard 算法来完成您的要求。见stackoverflow.com/questions/29634992/…
  • 您可以使用正则表达式来捕获数字,例如(\d) 适合您,请查看以下链接regex101.com/r/kP9iX9/1
  • 您说“一旦我将此字符串放入列表中,我就可以使用正常的算术顺序计算结果”,但不,您不能。您需要在示例中的加法之前进行乘法运算。您需要一个树结构来评估数学表达式。
  • 那么无论谁对答案投了反对票,你能解释一下原因吗?

标签: c# .net


【解决方案1】:

您可以使用内置的DataTable.Compute 方法而不是自己编写代码:

var result = new DataTable().Compute("1+2*3", null); // Will result in 7

编辑:

DataTable do not implement Dispose method 所以这样使用它们是安全的。但是,如果将它们包装在 using 语句中,它并不会变得更丑陋。查看相关的SO post

【讨论】:

  • 谢谢@fabien。我会试试这个。
  • DataTable 实现了IDisposable 所以不应该这样使用,因为你不能在完成后调用.Dispose()。必须参考才能处置。
  • @Enigmativity DataTable 没有用于 Dispose 的非托管资源,实际上是不实现它。见stackoverflow.com/a/913286/6170636
【解决方案2】:

我能够解决这个问题,而无需将字符串拆分为单独的元素(然后应用算术运算规则)。

using System;
using System.Data;
 public int Maths(string operation)
        {
            object result=new DataTable().Compute(operation, null);
            return Int32.Parse(result.ToString());
        }

【讨论】:

  • 我没有删除我的答案,因为我能够证明它并没有那么糟糕。
【解决方案3】:

您可以使用众多解析器生成器中的任何一个。我认为,在 .NET 平台中最受欢迎的是 Antlr。 或者,您甚至可以使用 Pratt 算法从头开始编写解析器,这非常容易。清晰指南 - http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多