使用 string.format 生成输出
使用 %s、%d、%f 及其他格式说明符格式化字符串。
使用 string.format 生成输出 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
string.format 基础
string.format(fmt, ...) 使用 C 风格的格式说明符格式化值,并返回格式化后的字符串。格式字符串包含字面文本和以 % 开头的转换说明符。这是在 Lua 中生成精确输出的主要方式。
print(string.format("Hello, %s!", "Lua")) -- Hello, Lua!
print(string.format("Pi is %.4f", math.pi)) -- Pi is 3.1416
print(string.format("%d items at $%.2f each", 5, 2.99))使用 %d 和 %i 格式化整数
%d 和 %i 用于格式化整数。添加宽度可以进行填充:%5d 会将内容右对齐到 5 个字符宽。%-5d 会左对齐。%05d 会使用零填充。这些说明符会截断浮点数——如有需要,请先使用 math.floor()。
print(string.format("%d", 42)) -- 42
print(string.format("%5d", 42)) -- 42 (right-aligned)
print(string.format("%-5d|", 42)) -- 42 | (left-aligned)
print(string.format("%05d", 42)) -- 00042
print(string.format("%+d", 42)) -- +42使用 %f 和 %e 格式化浮点数
%f 使用定点表示法格式化;%e 使用科学计数法;%g 会选择较短的表示形式。精度说明符(例如 %.2f)控制小数位数。默认精度为 6。
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%10.3f", 3.14)) -- 3.140
print(string.format("%e", 12345.678)) -- 1.234568e+04
print(string.format("%.2e", 0.001)) -- 1.00e-03
print(string.format("%g", 100.0)) -- 100使用 %s 格式化字符串
%s 用于插入字符串。非字符串值会通过 tostring 转换。宽度和对齐方式与数字相同。%q 会以 Lua 可读的格式为字符串加引号(并处理转义),适合用于序列化。
print(string.format("%-10s|", "hi")) -- hi |
print(string.format("%10s|", "hi")) -- hi|
print(string.format("%.3s", "hello")) -- hel (truncate)
print(string.format("%q", 'say "hi"'))-- "say \"hi\""
print(string.format("%s=%s", "key","val")) -- key=val使用 %x 和 %o 表示其他进制
%x 将整数格式化为十六进制(小写);%X 使用大写十六进制;%o 使用八进制;%u 使用无符号整数格式。这些格式适用于显示位掩码、颜色代码和进行底层编程。
print(string.format("%x", 255)) -- ff
print(string.format("%X", 255)) -- FF
print(string.format("%#x", 255)) -- 0xff (with prefix)
print(string.format("%o", 8)) -- 10 (octal)
print(string.format("%08x", 0xDEAD)) -- 0000dead多个值
传入的参数数量应与格式说明符的数量相同。参数数量必须匹配——参数太少会导致错误,多余参数会被忽略。使用格式字符串可以构建表格、日志或报告等结构化输出。
local function printRow(name, score, grade)
print(string.format("%-12s %3d %s", name, score, grade))
end
printRow("Alice", 95, "A")
printRow("Bob", 87, "B")
printRow("Carol", 91, "A")
-- Alice 95 A
-- Bob 87 B
-- Carol 91 A构建格式模板
将格式字符串保存为常量,以便重复使用。这样可以保持输出一致,也便于在一个位置修改格式。字符串格式化是日志记录、CSV 输出和报告生成的基础。
local LOG_FMT = "[%s] %s: %s"
local function log(level, module, msg)
print(string.format(LOG_FMT, level, module, msg))
end
log("INFO", "server", "started on port 8080")
log("WARN", "db", "connection pool low")
log("ERROR", "auth", "token expired")填充与对齐
使用宽度说明符对齐输出。正宽度会右对齐,负宽度会左对齐。这在需要对齐列的表格和报告中尤其有用。结合 string.rep 可以生成分隔线。
local fmt = "%-15s %6s %8s"
print(string.format(fmt, "Name", "Score", "Grade"))
print(string.rep("-", 31))
local data = {{"Alice",95,"A"},{"Bob",87,"B"},{"Dave",78,"C"}}
for _, r in ipairs(data) do
print(string.format(fmt, r[1], r[2], r[3]))
end%c 和 %% 字面量
%c 会将整数转换为对应的 ASCII 字符。%% 会生成字面百分号。这些格式适用于生成特殊字符,或在格式字符串中包含 %。
print(string.format("%c%c%c", 76, 117, 97)) -- Lua
print(string.format("100%%")) -- 100%
print(string.format("%.1f%%", 87.5)) -- 87.5%
-- Build a progress bar
local pct = 65
local filled = math.floor(pct / 5)
local bar = "[" .. string.rep("#",filled) .. string.rep(".",20-filled) .. "]"
print(bar .. " " .. pct .. "%")string.format 与 tostring
对于简单的任意类型转换,请使用 tostring;需要控制精度、填充或格式化多个值时,请使用 string.format。string.format("%s", val) 在转换字符串时会在内部调用 tostring。
-- tostring: simple, any type
print(tostring(3.14)) -- 3.14
print(tostring(true)) -- true
print(tostring(nil)) -- nil
-- string.format: precision + structure
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%d", 255)) -- 255
-- print(string.format("%d", true)) -- ERROR快速检查
string.format("%05.2f", 3.1) 会生成什么?
回顾:string.format
总结:
%s表示字符串,%d表示整数,%f表示浮点数,%x表示十六进制- 宽度:
%10d右对齐,%-10d左对齐,%010d使用零填充 - 精度:
%.2f(2 位小数),%.3s(3 个字符) %q为字符串加引号,以便 Lua 解析%%表示字面百分号
常见问题解答
「使用 string.format 生成输出」课时是免费的吗?
是的 — 「使用 string.format 生成输出」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「使用 string.format 生成输出」这节课中我会学到什么?
使用 %s、%d、%f 及其他格式说明符格式化字符串。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 string.format 生成输出」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 字符串基础:连接和长度
- 查找和提取子字符串
- 使用 string.format 生成输出
- string.gsub 和 string.gmatch