带有 Lua 的 Corona - 将文本转换为公式

Corona with Lua - Convert text to a formula

有没有办法将变量中的“1 + 2 * 3”转换为1 + 2 * 3?数字并不重要,我只是想弄清楚如何让 Lua 将字符串计算为数字。 tonumber() 对此不起作用。

如果你只需要简单的操作,这样的方法可能会起作用:

function calculator(expression)
  expression = expression:gsub("%s+", "")
  while true do 
    local head, op1, op, op2, tail = expression:match("(.-)(%d+)([%*/])(%d+)(.*)")
    if not op then break end
    expression = head .. tostring(op == '*' and op1 * op2 or op1 / op2) .. tail
  end
  while true do 
    local head, op1, op, op2, tail = expression:match("(.-)(%d+)([%+%-])(%d+)(.*)")
    if not op then break end
    expression = head .. tostring(op == '+' and op1 + op2 or op1 - op2) .. tail
  end
  return tonumber(expression)
end

function calculator(expression)
  expression = expression:gsub("%s+","")
  local n
  repeat
    expression, n = expression:gsub("(%d+)([%*/])(%d+)",
      function(op1,op,op2) return tostring(op == '*' and op1 * op2 or op1 / op2) end, 1)
  until n == 0
  repeat
    expression, n = expression:gsub("(%d+)([%+%-])(%d+)",
      function(op1,op,op2) return tostring(op == '+' and op1 + op2 or op1 - op2) end, 1)
  until n == 0
  return tonumber(expression)
end

print(calculator('1 + 2') == 3)
print(calculator('1+2+3') == 6)
print(calculator('1+2-3') == 0)
print(calculator('1+2*3') == 7)
print(calculator('1+2*3/6') == 2)
print(calculator('1+4/2') == 3)
print(calculator('1+4*2/4/2') == 2)
print(calculator('a+b') == nil)

有两个 calculator 函数以略有不同的方式做同样的事情:它们折叠表达式直到只有一个数字。 "1+2*3/6" 变成 "1+6/6",然后变成 "1+1",最后变成 "2",它以数字形式返回。