lua的坑(持续更新,每日更新两篇,11/17),更新到14个

  • 转载自: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       $
101112131415161718

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

猜你喜欢

转载自blog.csdn.net/weixin_43679037/article/details/119943258