带有 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"
,它以数字形式返回。
有没有办法将变量中的“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"
,它以数字形式返回。