Lua 中的格式化字符串

我想编写一个脚本,可以接受任何数字,然后以特定的格式将它们递增并返回。 例如这样

for i = 1,9 do
print(i)
end

将返回

1
2
3
4
5
6
7
8
9

但我希望它像这样打印

1 2 3
4 5 6
7 8 9

并且我希望它甚至可以处理超过 9 的数字,所以像 20 这样的数字会像这样显示

1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20

我确定可以使用 Lua 中的字符串库完成,但我不确定如何使用该库。

请帮忙解答!

点赞
用户1009479
用户1009479

for 循环可以填写第三个可选参数 _step_:

for i = 1, 9, 3 do
  print(string.format("%d %d %d", i, i + 1, i + 2))
end
2016-02-13 09:50:27
用户5352026
用户5352026

我能想到两种方法来实现这个:

local NUMBER = 20
local str = {}
for i=1,NUMBER-3,3 do
    table.insert(str,i.." "..i+1 .." "..i+2)
end
local left = {}
for i=NUMBER-NUMBER%3+1,NUMBER do
    table.insert(left,i)
end
str = table.concat(str,"\n").."\n"..table.concat(left," ")

另一种方法使用 gsub:

local NUMBER = 20
local str = {}
for i=1,NUMBER do
    str[i] = i
end
-- 将 "1 2 3 4 ..." 连接起来
str = table.concat(str," ")
-- 每 3 个数字为一组分割
-- "%d+ %d+ %d+" 匹配空格隔开的 3 个数字
-- (你可以用 "\t" 替换连接中的空格)
-- (...) 捕获可以允许我们用 %1 获取到这些数字
-- "%s?" 最后是为了去除任何后面的空格
-- (否则每行末尾都会多一个“N N N ”而不是“N N N”)
-- (使用 "?" 表示最后的三元组可能没有空格)
--    ^ 比如 NUMBER = 6 会以 "4 5 6" 结尾
-- "%1\n" 只用于获取数字并添加一个换行符
str = str:gsub("(%d+ %d+ %d+)%s?","%1\n")
print(str)

我对这两段代码进行了基准测试。上面的代码比下面的代码稍微快一点,但差别几乎没有:

使用 10000 次迭代测试
数字     20        20        20        100       100
上方     256 ms    276 ms    260 ms    1129 ms   1114 ms
下方     284 ms    280 ms    282 ms    1266 ms   1228 ms
2016-02-13 12:01:14
用户3979429
用户3979429

使用临时表来保存值,直到打印它们为止:

local temp = {}
local cols = 3

for i = 1,9 do
    if #temp == cols then
       print(table.unpack(temp))
        temp = {}
    end
    temp[#temp + 1] = i
end

-- 最后一分钟的检查,确保没有剩余
if #temp > 0 then
    print(table.unpack(temp))
end
temp = nil
2016-02-13 12:52:28
用户3735873
用户3735873
## 将数字按每行指定个数进行打印

```lua
function f(n,per_line)  --定义函数 f,n 表示数字的数量,per_line 表示每行的数量
  per_line = per_line or 3  --如果没有指定每行数量,默认为 3
  for i = 1,n do  --循环打印数字
    io.write(i,'\t')  --输出数字
    if i % per_line == 0 then io.write('\n') end  --如果当前行已经达到指定数量了,则换行
  end
end

f(9)  --打印 9 个数字,每行默认为 3 个
f(20)  --打印 20 个数字,每行默认为 3 个
2016-02-13 15:24:09