Lua计算器开发:如何将字符串方程转为可求解的可读方程?
问题原因
你用tonumber(equation)处理带运算符的字符串(比如"1 + 2")时,tonumber只能识别纯数字格式的字符串,带符号、空格的表达式无法被转换为数字,所以返回nil,最终输出的numberthingy自然就是nil。
解决方案1:使用load()快速实现计算
Lua的load()函数可以编译字符串为可执行代码,适合快速实现简单算术表达式的计算,修改后的代码如下:
io.write('Please insert equation: ', '\n') local restart = 1 local equation while restart == 1 do io.write('Is this correct? (Y/N): ', equation or '', '\n') local choice = io.read() if choice == 'Y' then -- 编译表达式并执行,返回计算结果 local func, err = load('return ' .. equation) if func then local result = func() print('Result: ' .. result) else print('Invalid equation: ' .. err) end restart = 0 elseif choice == 'N' then io.write('Please insert equation: ', '\n') equation = io.read() restart = 1 else print("Please choose Y or N") restart = 1 end end
改动说明
- 删掉了冗余的
incorrect变量,简化循环逻辑 - 用
load()替换tonumber(),通过return让表达式返回计算结果 - 添加错误捕获,若输入非法表达式(比如"1 + ")会提示具体错误
注意:这个方法会执行用户输入的任意Lua代码,作为学习项目没问题,但公开使用的程序需谨慎,存在安全风险。
解决方案2:手动解析表达式(适合学习原理)
如果想理解表达式解析的底层逻辑,可以手动拆分数字和运算符,实现基础的加减乘除计算:
io.write('Please insert equation: ', '\n') local restart = 1 local equation -- 自定义计算函数,处理"数字 运算符 数字"格式的表达式 function calculate(expr) local num1, op, num2 = expr:match("(%d+)%s+([%+%-/%*])%s+(%d+)") if not num1 or not op or not num2 then return nil, "Invalid format. Use 'num op num' (e.g., 1 + 2)" end num1 = tonumber(num1) num2 = tonumber(num2) if op == '+' then return num1 + num2 elseif op == '-' then return num1 - num2 elseif op == '*' then return num1 * num2 elseif op == '/' then if num2 == 0 then return nil, "Division by zero" end return num1 / num2 else return nil, "Unsupported operator" end end while restart == 1 do io.write('Is this correct? (Y/N): ', equation or '', '\n') local choice = io.read() if choice == 'Y' then local result, err = calculate(equation) if result then print('Result: ' .. result) else print(err) end restart = 0 elseif choice == 'N' then io.write('Please insert equation: ', '\n') equation = io.read() restart = 1 else print("Please choose Y or N") restart = 1 end end
说明
- 用字符串匹配
match提取两个数字和中间的运算符 - 根据运算符类型执行对应计算
- 处理了非法格式、除零错误等异常情况
- 可以在此基础上扩展,支持多步运算、括号、负数等更复杂的表达式
内容的提问来源于stack exchange,提问作者JamezTheSavage
相关产品推荐
相关产品推荐

