本文接《C++按编号拼接字符串》,给出Lua版本,具体就不详述了。直接上代码。
1. 简单拼接
function sprintf_x(fmt, ...)
-- local arg = {...} -- lua5.1以上的版本,后面的arg.n改成#arg
local xfmt = string.gsub(fmt, "%%%s*(%d+)", function(n)
n = tonumber(n)
if n and n >= 1 and n <= arg.n then
return arg[n]
end
return ""
end)
return xfmt
end
用“..”连接的,可以用sprintf_x来替代:
"学" .. "Lua" .. ",从" .. "入门" .. "到" .. "精通" .. ",只需" .. 210 .."天"
-- 可以替换为:
sprintf_x("学%1,从%2到%3,只需%4天", "Lua", "入门", "精通", 210)
2. 精细化拼接
function sprintf_y(fmt, ...)
-- local arg = {...} -- lua5.1以上的版本,后面的arg.n改成#arg
local xfmt = string.gsub(fmt, "%%%s*(%d+)", function(n)
n = tonumber(n)
if n and n >= 1 and n * 2 <= arg.n then
return string.format(arg[n * 2], arg[n * 2 - 1])
end
return ""
end)
return xfmt
end
用string.format(fmt, …)格式化的,可以用sprintf_y来替代:
string.format("学%.3s,从%s到%s,只需%-4d天", "Lua", "入门", "精通", 210)
-- 可以替换为:
sprintf_y("学%1,从%2到%3,只需%4天", "Lua", "%.3s", "入门", "%s", "精通", "%s", 210, "%-4d")