我正在从Ruby脚本输出一组编号的文件。这些数字来自递增计数器,但为了使它们在目录中很好地排序,我想在文件名中使用前导零。换句话说
... file_001
而不是
file_1
在将数字转换为字符串时,是否有简单方法添加前导零? (我知道我可以“如果少于10 ......如果少于100”)。
答案 0 :(得分:322)
使用带有字符串的%
运算符:
irb(main):001:0> "%03d" % 5
=> "005"
左侧是printf格式字符串,右侧可以是值列表,因此您可以执行以下操作:
irb(main):002:0> filename = "%s/%s.%04d.txt" % ["dirname", "filename", 23]
=> "dirname/filename.0023.txt"
这是一个printf format cheat sheet,您可能会发现在形成格式字符串时非常有用。 printf格式最初来自C
函数printf
,但在perl,ruby,python,java,php等中可以使用类似的格式化函数。
答案 1 :(得分:255)
如果计数器中的最大位数已知(例如,对于计数器1..876,n = 3),则可以
str = "file_" + i.to_s.rjust(n, "0")
答案 2 :(得分:46)
在连接文件名之前,你不能只使用值的string formatting吗?
"%03d" % number
答案 3 :(得分:26)
使用String#next
作为计数器。
>> n = "000"
>> 3.times { puts "file_#{n.next!}" }
file_001
file_002
file_003
next
相对“聪明”,这意味着你甚至可以选择
>> n = "file_000"
>> 3.times { puts n.next! }
file_001
file_002
file_003
答案 4 :(得分:4)
如其他答案所述,"%03d" % number
效果很好,但是与rubocop ruby style guide背道而驰:
优先使用sprintf及其别名格式 神秘的String#%方法
我们可以使用以下方法以更易读的方式获得相同的结果:
format('%03d', number)
答案 5 :(得分:0)
filenames = '000'.upto('100').map { |index| "file_#{index}" }
输出
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]