在使用 Lua 进行实际开发的过程中,格式化字符串的函数 string.format() 的使用频率是非常高的,这里整理一下关于这个函数的使用。
参数解析
string.format(formatstring, ...)
formatstring 为格式化串(必须是一个字符串),其中可能包含多个转义码(例如最为常用的 %d %s 等)。
... 为数量不定的参数列表,以逗号分隔,与格式化串中的转义码一一对应。
返回值为格式化之后的字符串(string)。
e.g.
print(string.format("%s Have %d Olympic Gold Medals!", "Kevin Durant", 3))
-- Kevin Durant Have 3 Olympic Gold Medals!
转义码
格式化串中支持的转义码有以下这些:
%c
接收一个数字,并将其转化为 ASCII 码表中对应的字符。
print(string.format("%c", 65)) -- A
print(string.format("%c", 97)) -- a
%d
接收一个数字,并将其转化为有符号的整数格式。(%i 与 %d 作用一致)
print(string.format("%d", 666)) -- 666
print(string.format("%d", -666)) -- -666
%e
接收一个数字,并将其转化为科学记数法格式, 使用小写字母 e。
print(string.format("%e", 666)) -- 6.660000e+002
print(string.format("%e", -666)) -- -6.660000e+002
%E
接收一个数字,并将其转化为科学记数法格式, 使用大写字母 E。
print(string.format("%E", 666)) -- 6.660000E+002
print(string.format("%E", -666)) -- -6.660000E+002
%f
接收一个数字,并将其转化为浮点数格式。
print(string.format("%f", 666)) -- 666.000000
print(string.format("%f", -666)) -- -666.000000
%g
接收一个数字,并将其转化为 %e 及 %f 中较短的一种格式。
print(string.format("%g", 666666)) -- 666666
print(string.format("%g", -6666666)) -- -6.66667e+006
%G
接收一个数字,并将其转化为 %G 及 %f 中较短的一种格式。
print(string.format("%G", 666666)) -- 666666
print(string.format("%G", -6666666)) -- -6.66667E+006
%o
接收一个数字,并将其转化为八进制数格式。
print(string.format("%o", 10)) -- 12
print(string.format("%o", 17)) -- 21
%q
接收一个字符串,并将其转化为可安全被 Lua 编译器读入的格式。
print(string.format('%q', 'Hello \n "fightsyj" !'))
-- "Hello \
-- \"fightsyj\" !"
%s
接收一个字符串,并按照给定的参数格式化该字符串。
print(string.format("Hello %s !", "fightsyj")) -- Hello fightsyj !
%u
接收一个数字,并将其转化为无符号整数格式。
print(string.format("%u", 666)) -- 666
print(string.format("%u", -1)) -- 4294967295
关于上面示例中用 %u 格式化 -1 时输出一个很大的数的详解。
%x
接收一个数字,并将其转化为十六进制数格式,使用小写字母。
print(string.format("%x", 15)) -- f
print(string.format("%x", 666)) -- 29a
%X
接收一个数字,并将其转化为十六进制数格式, 使用大写字母。
print(string.format("%X", 15)) -- F
print(string.format("%X", 666)) -- 29A
转义码参数
为进一步细化格式,还可以在转义码的 % 后添加参数:
+
表示其后的数字转义码将让正数显示正号。(默认情况下只有负数显示符号)
print(string.format("%d", -666)) -- -666
print(string.format("%d", 666)) -- 666
print(string.format("%+d", -666)) -- -666
print(string.format("%+d", 666)) -- +666
0
在后面指定了字串宽度时占位用(不填时的默认占位符是空格)。
print(string.format("%d", 666)) -- 666
print(string.format("%5d", 666)) -- 666
print(string.format("%05d", 666)) -- 00666
-
在指定了字串宽度时,默认为右对齐,增加 - 可以改为左对齐。
print(string.format("%d", 666)) -- 666
print(string.format("%5d", 666)) -- 666
print(string.format("%-5d", 666)) -- 666
.
当转义码是 %f 时,后接数字 n,标明保留的 n 位小数;
当转义码是 %s 时,后接数字 n,标明显示前面 n 位。
-- %f
print(string.format("%f", 666)) -- 666.000000
print(string.format("%0.2f", 666)) -- 666.00
print(string.format("%.2f", 666)) -- 666.00
-- %s
print(string.format("%s", "Hello")) -- Hello
print(string.format("%0.2s", "Hello")) -- He
print(string.format("%.2s", "Hello")) -- He
ps
- 转义码中添加参数的顺序为:%[指定参数][标识符][宽度][.精度]指示符。
- 使用 string.format() 输出 % 需要用 %%。
e.g.
print(string.format("%d%%", 50)) -- 50%