【发布时间】:2017-01-23 07:36:43
【问题描述】:
我有一个 Lua 函数可以将两位整数转换为书面文字,例如“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)
【问题讨论】:
-
一年多以前我也写过同样的文章。请看gist.github.com/hjpotter92/…
-
@hjpotter92 - 有趣。您的代码为输入
0提供了错误的结果(应返回字符串“零”)并为输入100崩溃。顺便说一句,(n % 10 > 0 and num[n % 10] or '')可以简化为num[n % 10] -
@hjpotter92 - 另一个注意事项:
tens[0]已定义但从未使用过。 -
@hjpotter92 - 它也在
25上崩溃 -
@hjpotter92 - Improved version of your function
标签: lua