基于字符串的计算器,包含单位和有理数

时间:2014-05-13 03:03:21

标签: ruby string math calculator units-of-measurement

给定一个字符串

7 1/3 inches - 4.12mm

将混合数字(7 1/3)与建立下面的订单操作相关联的最佳方法是什么?

((7 1/3) inches) - (4.12 millimeters) = 7.17112861 inches

我的第一次尝试是将字符串与运算符(+, - ,*,/,%)分开,但显然不符合理性要求。操作顺序是关键,但我对如何通过代码实现这一点感到迷茫。

2 个答案:

答案 0 :(得分:1)

我认为你真的需要使用定义语法来查看正确的解析器。类似于lex / yacc解决方案。我并不熟悉ruby,但似乎有一些ruby实现

http://www.ruby-doc.org/stdlib-2.1.0/libdoc/racc/parser/rdoc/Racc.html http://i.loveruby.net/en/projects/racc/doc/

您可以将空格视为与添加功能相同的运算符。除了标准数学运算符的规则之外,您可能还有

exp:exp''exp {result = val [0] + val 1}    | exp'+'exp {result = val [0] + val 1}    | exp' - 'exp {result = val [0] - val 1}    | exp'*'exp {result = val [0] * val 1}    | exp'/'exp {result = val [0] / val 1}

您需要添加优先规则和规则来处理计量单位。

另一种方法是实现一个可以解析数学表达式的Shunting-yard algorithm

答案 1 :(得分:0)

为了在不丢失顺序的情况下将字符串拆分为其部分,您可以执行以下操作:

s = '7 1/3 inches - 4.12mm'

s.split(/(?: |(?:(?<=\d)(?=[a-z]))|(?:(?<=[a-z])(?=\d)))/)
# => ["7", "1/3", "inches", "-", "4.12", "mm"] 

此代码在空格和数字与字母之间的边界上分割。

现在你所要做的只是lex数组,并计算你的结果