当输入为10的倍数时,Lua函数失败
我有一个Lua函数,可以将两位数的整数转换成文字,比如“12”变成“12”。我想我已经把所有的东西都用上了,除了当我输入一个10,20,30等的直接倍数的数字时。代码失败了 我得到的具体错误是当输入为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/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