前言
重新开始更新的第一天,我们来聊一个轻松一点的函数,tonumber()
这是个将指定参数转换成数字的函数,利用这个函数可以做一下数字进制的转换,使用起来比较方便。
内容
tonumber
- tonumber(e [, base])
- 解释:这个函数会尝试将它的参数转换为数字,如果参数已经是一个数字或者是一个可以转换成数字的字符串,那么这个函数就会返回转换后的数字,否者返回nil表示无法转换。这个函数有一个额外的参数base可以来指定参数的进制,它的取值范围是[2,36],当这个参数超过10的时候,使用
A
代表10(大小写都可以),B
代表11,以此类推最后Z
代表35,默认的这个参数是10,数字能有一个小数部分,也会有一个指数部分,只有可识别的整数可以被接受。
usage
- 首先我们新建一个文件将文件命名为tonumbertest.lua然后编写代码如下:
-- 定义一个等待转换的列表
local wait_list = {
a = 13,
b = "36",
c = "52s",
d = false,
e = function() print("e") end,
f = 32,
g = "A3",
}
-- 转换已经是数字的变量
print("\nwait_list.a =", tonumber(wait_list.a))
-- 转换全是数字的字符串
print("\nwait_list.b =", tonumber(wait_list.b))
-- 转换包含字母的字符串
print("\nwait_list.c =", tonumber(wait_list.c))
-- 转换值为false的变量
print("\nwait_list.d =", tonumber(wait_list.d))
-- 转换值保存函数的变量
print("\nwait_list.e =", tonumber(wait_list.e))
-- 将数字看成二进制来转换=3*2+2 什么玩意,2进制出现3,错误!
print("\nwait_list.f(2) =", tonumber(wait_list.f, 2))
-- 将数字看成四进制来转换=3*4+2
print("wait_list.f(4) =", tonumber(wait_list.f, 4))
-- 将数字看成八进制来转换=3*8+2
print("wait_list.f(8) =", tonumber(wait_list.f, 8))
-- 将数字看成十进制来转换=A*10+3 什么玩意,10进制出现A,错误!
print("\nwait_list.g(10) =", tonumber(wait_list.g, 10))
-- 将数字看成十六进制来转换=A*16+3
print("wait_list.g(16) =", tonumber(wait_list.g, 16))
-- 将数字看成32进制来转换=A*32+3
print("wait_list.g(32) =", tonumber(wait_list.g, 32))
- 运行结果
总结
- 观察变量
a
和b
的值可知,再不改变函数的第二个参数时,数字和数字字符串可以成功转换成10进制数。 - 变量
b
、c
、d
因为进制或变量类型等原因无法成功转换而返回nil
。 - 变量
f
和g
都因为不是指定进制下的合法数字,所以返回nil,比如wait_list.f=32
,如果用二进制解析就是错误的,二进制中没有2和3。 - 变量
f
和g
后两种都是正常的转换,通过注释的内容就可以看到,比如wait_list.g="A3"
,如果把它看成16进制,那么A就是10,所有结果是10*16+3,也就是163。