文章目录
- 转载自:https://blog.csdn.net/weixin_43994445/article/details/109135215
1.把数值转成16进制的格式
print(string.format('%x', 1221197823))
输出:
48c9ffff
2.去掉商里的小数
- 背景:用"/"来做除法, 得到的结果中总会带有小数, 像这样:
print(700 / 100)
print(701 / 100)
输出:
7.0
7.01
- 需求:当结果是7.0时去掉小数部分, 当结果是7.01的时候要保留小数部分
- 思路:
local t1, t2 = math.modf(700 / 100)
print(t1)
print(t2)
输出:
7 --t1是7
0.0 --t2是0.0,存的小数部分
function GetFixedQuotient(num1, num2)
quotient = num1 / num2
local t1, t2 = math.modf(quotient)
-- 去掉数字后面的.0
if t2 == 0 then
return t1 //t1是整数
else
return quotient //quotient是整数+小数
end
end
print(GetFixedQuotient(700, 100))
print(GetFixedQuotient(701, 100))
输出:
7
7.01
3.string.format()保留三位小数
print(string.format('%.3f',0.5))
print(string.format('%.3f',0.0005))
print(string.format('%.3f',0.0004))
print(string.format('%.3f',500))
输出:
0.500
0.001(这里四舍五入了)
0.000(这里四舍五入了)
500.000
4.向上/下取整,四舍五入
1.取整
print('向上取整:1/3 = ' .. math.ceil(1/3))
print('向下取整:1/3 = ' .. math.floor(1/3))
2.四舍五入
print('四舍五入:1/3 = '..math.floor(1/3 + 0.5))
print('四舍五入:2/3 = '..math.floor(2/3 + 0.5))
3.保留三位小数的四舍五入
print('四舍五入:1/3 = '..math.floor(1/3*1000 + 0.5)/1000)
print('四舍五入: 2 / 3 = ' .. math.floor(2 / 3 * 1000 + 0.5) / 1000)
输出:
向上取整: 1 / 3 = 1
向下取整: 1 / 3 = 0
四舍五入: 1 / 3 = 0
四舍五入: 2 / 3 = 1
四舍五入: 1 / 3 = 0.333
四舍五入: 2 / 3 = 0.667
4.但是以上代码如果处于0.5会有错误,下面是优化的代码
local function round(x)
local data1,data2 = math.modf(x)
if(x >= 0) then
if(0.5 <= math.abs(data2)) then
return data1+1
else
return data1
end
end
if(0.5 <= math.abs(data2)) then
return data1-1
else
return data1
end
end
local l1 = round(3.5)
local l2 = round(3.4)
local l3 = round(3.6)
local l4 = round(-3.2)
local l5 = round(-3.6)
print(l1,l2,l3,l4,l5)
//----------------------------
[root@legend2 codeTrain]# lua test8.lua 4 3 4 -3 -4
5.string字符串拆成表
input = "ab23^&*)$大大大"
tabA={}
for i=1,#input do
let = string.sub(input,i,i)//let就是单个字符
table.insert(tabA,i,let) //插入表tabA,i对应字符
print(i,let)
end
- 效果
root@iZbp1do67v9l7zwkcs2b22Z:~/kunmk/test/lua# lua test.lua
1 a
2 b
3 2
4 3
5 ^
6 &
7 *
8 )
9 $
10 �
11 �
12 �
13 �
14 �
15 �
16 �
17 �
18 �
6.敏感词过滤
input = 'ABc大大大'
word = 'bc大'
lower = string.lower(input)
result = lower
if string.find(lower, tostring(word)) ~= nil then
-- 汉字占3个字符, 所以不能直接用string.len()
local _, count = string.gsub(word, '[^\128-\193]', '')
print(count)
local stars = string.rep('*', count)
print(stars)
result = string.gsub(lower, tostring(word), stars)
end
print(result)
- 效果
root@iZbp1do67v9l7zwkcs2b22Z:~/kunmk/test/lua# lua test.lua
3
***
a***大大
7.同名传参/同名字段相关bug
1)2个同名传参, 第1个传参无效
function Do(arg, arg)
print(arg)
end
Do(1, 2)
输出:
2
2)2个同名字段, 第2个字段无效
a, a = 1, 2
print(a)
输出:
1
8.表作为传参: 浅拷贝的相关bug
1)表作为参数传递时, 是浅拷贝,原表也会改变
如下↓, 改变"参数表"(arg)的内容, “原来的表”(tab)也会改变
function ReName(arg)
arg.name = '咸蛋超人'
end
tab = {name = '奥特曼'}
ReName(tab)
print(tab.name)
输出:
咸蛋超人
2)但是, 改变arg表自身, tab不变
function ReName(arg)
arg = {name = '咸蛋超人'}
end
tab = {name = '奥特曼'}
ReName(tab)
print(tab.name)
输出:
奥特曼
9.windwos安装lua
10.通配符,正则表达式
s = "abc \"it's a cat\""
_, _, _, d = string.find(s, "([\"'])(.-)%1")
print(d) -----输出: it's a cat
11.用正则实现trim()
name = ' 蒂纳 奥特曼 '
local _name = string.gsub(name, '^%s*(.-)%s*$', '%1')
print(_name)
输出:蒂纳 奥特曼
12.字符串截取string.sub()的使用方法
s = 'abcde'
print(string.sub(s, 1, 3)) -- 从1数到3
print(string.sub(s, 3, 3)) -- 从3数到3
print(string.sub(s, 3)) -- 从3数到末尾
print(string.sub(s, 8)) -- 没有8,直接空了
print(string.sub(s, 3, -1)) -- 从3数到5(末尾)
print(string.sub(s, 3, -2)) -- 从3数到4(末尾-1)
print(string.sub(s, -4, -2)) --从2(末尾-3)数到4(末尾-1)
print(string.sub(s, -9))-- 从头数到尾
-- 输出:
abc
c
cde
cde
cd
bcd
abcde
13.数组增删
数组能用, 字典不行
table.insert(list, [pos, ]value), -- 不给pos就是#list+1
table.remove(list[, pos]), -- 不给pos就是#list
注意: 在for的时候, 要从后往前删
14.if后面跟一个方法, 这个方法会运行
function fun()
print(2)
end
if fun() then
end
输出: 2
↓写成这样则不执行
if fun then
end
15、// 运算, 取商
//是取商符号
print(5 // 2)
print(5.0 // 2)
print(5 // 2.0)
输出:
2
2.0
2.0
注意: 当被除数或除数为浮点数时, 结果也是浮点数
16、按位运算
a~b 按位异或
~a 按位取反
17、方法后面不加小括号
function aaa(t)
print(t[1])
end
--因为传参是table, 所以可省略小括号
--正常写法为:
a = aaa({2, 3})
--省略写法为:
a = aaa {2, 3}
----
a = aaa{"a", "b"}
》打印"a"
18、返回多个值
function fun()
return 1, 2, 3
end
print("额", fun())
print(fun(), "额") -- 因为fun不是最后一个, 所以只返回一个值
print((fun())) -- 强制仅返回一个值
输出:
额 1 2 3
1 额
1
19、实现continue
- 思路
思路: 用一次性while里的if-break作为continue
for i = 1, 10 do
while true do
if i > 3 and i < 8 then
break
end
print(i)
break
end
end
输出:
1 2 3 8 9 10
20、虚变量
(虚设变量/ 虚拟变量/ 名义变量/ 哑元变量/ 哑变量 叫啥玩意都行)
t = {'迪迦', '戴拿', '蒂格', '蒂纳'}
for k, v in pairs(t) do
print(v)
end
->↓此写法表示: 我不需要理会k这个变量 , 即, 虚变量
t = {'迪迦', '戴拿', '蒂格', '蒂纳'}
for _, v in pairs(t) do
print(v)
end