You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:45:34