【问题标题】:Evaluating a mathematical expression given as text评估以文本形式给出的数学表达式
【发布时间】:2012-01-21 15:40:23
【问题描述】:

我正在尝试制作一个类似计算器的程序,在该程序中,可以在文本框中输入计算,然后将该计算转换为 int 并得到结果,这就是我所拥有的,但它不起作用

string calcStr = textBox1.Text;
int result = calcStr;

有什么不太复杂的建议吗?

【问题讨论】:

  • 我听说正则表达式会让这变得超级简单...
  • @YuriyFaktorovich,你听到的是错误的。

标签: c# string int


【解决方案1】:

如果我理解问题正确,您希望能够从文本框中解析像 1 + 3 + 4 这样的表达式并根据输入执行计算。这实际上是一项比人们想象的更难的任务。

一种常见的解决方案是使用 Shutting-yard 算法来解析表达式。详情请见http://en.wikipedia.org/wiki/Shunting-yard_algorithm

【讨论】:

  • 这个问题没有说明他试图解析的字符串的格式。这是通用中缀表示法的一个很好的答案。但是,我要提一下,如果输入可以用波兰语表示法获得,那么实际的计算算法会更容易实现。 (+1)。
【解决方案2】:

使用NCalc 进行此类工作...它是免费的,带有源代码,可以完成所有繁重的工作(解析数学表达式等),并为您提供计算结果。

【讨论】:

    【解决方案3】:

    如果您想简单地从字符串中解析出数字,请使用类似

    的函数
    Int32.Parse(string)
    

    如果你需要取出一个公式,比如 “3+4/2” 那么你需要一次提取一个字符并确定它是什么。

    如果字符串是 “32+4/12” 您必须遍历字符串中的每个字符,并尝试将当前字符解析为数字。 有一个功能可以测试它是否是数字。或者只是检查它的 ascii 值。

    如果成功,则取当前数字加上下一个数字,然后重试,直到遇到非数字字符。 现在您可以提取您的号码。 不是数字的字符会根据您允许的数学运算符进行检查。其他任何事情都会引发错误。

    一旦您可以提取所有的整个方程式,您可能需要执行堆栈操作之类的操作来评估它。我相信在我的 Assembly 类中,您会将一堆数字和运算符推送到堆栈中,然后从顶部将其弹出一个,并通过其间的运算符评估前一个数字和下一个数字。

    我希望这就是你所说的。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多