Lua base converter

Wol*_*and 6 lua

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

stringto 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)都充满了细微之处,我将其作为练习留给读者.