I need a base converter function for Lua. I need to convert from base 10 to base 2,3,4,5,6,7,8,9,10,11...36 how can i to this?
RBe*_*eig 14
在string
to number
方向,该函数tonumber()
采用可选的第二个参数来指定要使用的基数,其范围可以是2到36,对于大于10的基数中的数字具有明显的含义.
在数字到字符串的方向上,这可以比Nikolaus的回答更有效地做到这样:
local floor,insert = math.floor, table.insert function basen(n,b) n = floor(n) if not b or b == 10 then return tostring(n) end local digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" local t = {} local sign = "" if n < 0 then sign = "-" n = -n end repeat local d = (n % b) + 1 n = floor(n / b) insert(t, 1, digits:sub(d,d)) until n == 0 return sign .. table.concat(t,"") end
这通过使用table.concat()
而不是重复调用字符串连接运算符来创建更少的垃圾字符串..
.虽然它对于这么小的字符串几乎没有什么实际意义,但是应该学习这个习惯用法,因为否则在连接中使用连接运算符构建缓冲区实际上会倾向于O(n 2)性能,而table.concat()
设计得更好.
有一个未解决的问题是,是否更有效地t
通过调用将表中的数字推到表中table.insert(t,1,digit)
,或者将它们追加到最后t[#t+1]=digit
,然后调用以string.reverse()
正确的顺序放置数字.我将基准测试留给学生.请注意,虽然我粘贴的代码确实运行并且似乎得到了正确的答案,但还有其他机会可以进一步调整它.
例如,基础10的常见情况被剔除并用内置tostring()
功能处理.但是对于具有string.format()
("%o"
和"%x"
分别)转换说明符的基数8和16,可以进行类似的剔除.
此外,Nikolaus的解决方案和我的解决方案都不是特别好.我强调这里通过在开头强制值为n
整数math.floor()
.
正确地将一般浮点值转换为任何基数(甚至是基数10)都充满了细微之处,我将其作为练习留给读者.