当输入为10的倍数时,Lua函数失败

当输入为10的倍数时,Lua函数失败,lua,Lua,我有一个Lua函数,可以将两位数的整数转换成文字,比如“12”变成“12”。我想我已经把所有的东西都用上了,除了当我输入一个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函数,可以将两位数的整数转换成文字,比如“12”变成“12”。我想我已经把所有的东西都用上了,除了当我输入一个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)
余数为0时,函数num2wordint不返回任何内容

肮脏而简单的修复方法是转换每个代码段,如:

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


我的解决方案是忘记if语句,只做一些表索引。不过,我节省了一些空间,只是用一些基本值制定了一些简单的规则:

local num2str
do
   local bases = {[0]="","one","two","three","four","five","six","seven","eight","nine",[10]="ten",[11]="eleven",[12]="twelve",[13]="thirteen",[15]="fifteen",[20]="twenty",[30]="thirty",[40]="fourty",[50]="fifty",[60]="sixty",[70]="seventy",[80]="eighty",[90]="ninety"}

   function num2str(n)
      local s = tostring(n)
      if n < 20 then
         return bases[n] or bases[tonumber(s:sub(2,2))].."teen"
      else
         return bases[tonumber(s:sub(1,1))*10]..bases[tonumber(s:sub(2,2))]
      end
   end
end

for i = 1,99 do
   print(num2str(i))
end

我一年多前也写过同样的东西。请看一看@hjpotter92-很有趣。您的代码为输入0提供了错误的结果,应该返回字符串0,并且输入100会崩溃。顺便说一句,n%10>0和num[n%10]或者可以简化为num[n%10]@hjpotter92-还有一点需要注意:定义了十个[0],但从未使用过。@hjpotter92-它也会在上崩溃25@hjpotter92-此外,如果使用字符串键,则可以消除tonumber调用。
local num2str
do
   local bases = {[0]="","one","two","three","four","five","six","seven","eight","nine",[10]="ten",[11]="eleven",[12]="twelve",[13]="thirteen",[15]="fifteen",[20]="twenty",[30]="thirty",[40]="fourty",[50]="fifty",[60]="sixty",[70]="seventy",[80]="eighty",[90]="ninety"}

   function num2str(n)
      local s = tostring(n)
      if n < 20 then
         return bases[n] or bases[tonumber(s:sub(2,2))].."teen"
      else
         return bases[tonumber(s:sub(1,1))*10]..bases[tonumber(s:sub(2,2))]
      end
   end
end

for i = 1,99 do
   print(num2str(i))
end