0Pricing
Lua Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 字符串基础:连接和长度
  2. 查找和提取子字符串
  3. 使用 string.format 生成输出
  4. string.gsub 和 string.gmatch
← 返回 Lua Academy