当输入是十的倍数时,Lua函数失败

时间:2017-01-20 13:22:28

标签: lua

我有一个Lua函数将两位数整数转换为书面文字,例如' 12'成为“十二岁”。我以为我已经完成了所有工作,除非我输入的数字是10(10,20,30等)的直接倍数,代码失败。

我得到的具体错误是

./.lua/num2word:4: attempt to perform arithmetic on local 'number' (a nil value)
stack traceback:
    ./.lua/num2word:4: in function 'num2wordint'
    ./.lua/num2word:117: in main chunk
    [C]: in ?

但我在任何其他数字上得到正确的输出。

我尝试重新定义number变量的范围,但要么在所有情况下都会破坏代码,要么对问题案例没有帮助。

我一直在查看代码,以及一堆lua支持文档,现在已经有几个小时了,而且超出了我的范围。

#! /usr/local/bin/lua

function num2wordint(number)
    local number = number + 0
    local outstring=""
    if number / 10 >= 9 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Ninety"
        else
            outstring= outstring.."Ninety-"
            return outstring, remainder
        end
    elseif number / 10 >= 8 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Eighty"
        else
            outstring= outstring.."Eighty-"
            return outstring, remainder
        end
    elseif number / 10 >= 7 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Seventy"
        else
            outstring= outstring.."Seventy-"
            return outstring, remainder
        end
    elseif number / 10 >= 6 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Sixty"
        else
            outstring= outstring.."Sixty-"
            return outstring, remainder
        end
    elseif number / 10 >= 5 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Fifty"
        else
            outstring= outstring.."Fifty-"
            return outstring, remainder
        end
    elseif number / 10 >= 4 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Forty"
        else
            outstring= outstring.."Forty-"
            return outstring, remainder
        end
    elseif number / 10 >= 3 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Thirty"
        else
            outstring= outstring.."Thirty-"
            return outstring, remainder
        end
    elseif number / 10 >= 2 then
        local remainder = number % 10
        if remainder == 0 then
            outstring= outstring.."Twenty"
        else
            outstring= outstring.."Twenty-"
            return outstring, remainder
        end
    else
        if number == 19 then
            outstring=outstring.."Nineteen"
        elseif number == 18 then
            outstring=outstring.."Eighteen"
        elseif number == 17 then
            outstring=outstring.."Seventeen"
        elseif number == 16 then
            outstring=outstring.."Sixteen"
        elseif number == 15 then
            outstring=outstring.."Fifteen"
        elseif number == 14 then
            outstring=outstring.."Fourteen"
        elseif number == 13 then
            outstring=outstring.."Thirteen"
        elseif number == 12 then
            outstring=outstring.."Twelve"
        elseif number == 11 then
            outstring=outstring.."Eleven"
        elseif number == 10 then
            outstring=outstring.."Ten"
        elseif number == 9 then
            outstring=outstring.."Nine"
        elseif number == 8 then
            outstring=outstring.."Eight"
        elseif number == 7 then
            outstring=outstring.."Seven"
        elseif number == 6 then
            outstring=outstring.."Six"
        elseif number == 5 then
            outstring= outstring .. "Five"
        elseif number == 4 then
            outstring=outstring.."Four"
        elseif number == 3 then
            outstring=outstring.."Three"
        elseif number == 2 then
            outstring=outstring.."Two"
        elseif number == 1 then
            outstring=outstring.."One"
        end
        return outstring, 0
    end
end

local words, leftOver = num2wordint(arg[1])
local i = 1
while i ~= 0 do
    local inword, inrem = num2wordint(leftOver)
    words = words .. inword
    if inrem == 0 then
        i = 0
    else
        leftOver = inrem
    end
end

print(words)

2 个答案:

答案 0 :(得分:1)

num2wordintremainder时,函数0不会返回任何内容。

肮脏而简单的解决方法是将每个代码段转换为:

    if remainder == 0 then
        outstring= outstring.."Ninety"
    else
        outstring= outstring.."Ninety-"
        return outstring, remainder
    end

    if remainder == 0 then
        outstring= outstring.."Ninety"
    else
        outstring= outstring.."Ninety-"
    end
    return outstring, remainder

答案 1 :(得分:0)

我的解决方法是忘记if语句,只做一些表索引。我保存了一些空间,只是制定了一些基本值的简单规则:

DbContextOptionsBuilder