我有一个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)
答案 0 :(得分:1)
当num2wordint
为remainder
时,函数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