Lua基础转换器
我需要一个用于 Lua 的进制转换函数。我需要将数字从十进制转换为二进制、三进制、四进制、五进制、六进制、七进制、八进制、九进制、十进制、十一进制......直到三十六进制。我该如何做到这一点?
原文链接 https://stackoverflow.com/questions/3554315
在 string
到 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()
设计得更好。
是否通过使用 table.insert(t,1,digit)
调用将数字推入表 t
中的堆栈,还是将它们附加到末尾并调用 string.reverse()
以使数字顺序正确,这个问题尚未解答。我将把基准测试留给学生们。请注意,虽然我在此贴的代码确实可以运行,并且似乎能得到正确的答案,但是可能还有其他调优的机会。
例如,可以使用内置的 tostring()
函数将通用情况下的十进制基数 10 筛选出来并处理掉。但是类似的筛选也可以用于具有 string.format()
的转换说明符的 8 和 16 进制基数(分别为 "%o"
和 "%x"
)。
此外,无论是 Nikolaus 的解决方案还是我的解决方案都不能很好地处理非整数。我在这里强调一下,通过在开头使用 math.floor()
将值 n
强制转换为整数。
将通用浮点值正确地转换为任何基数(甚至是基数 10)都有很多微妙之处,这些微妙之处留给读者作为练习。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你可以使用循环将一个整数转换为包含所需基数的字符串。对于小于10的基数,使用以下代码。如果需要大于该值的基数,则需要添加一行将x % base的结果映射到字符的代码(例如使用数组)。
x = 1234 r = "" base = 8 while x > 0 do r = "" .. (x % base ) .. r x = math.floor(x / base) end print( r );