我正在从Ruby脚本输出一组编号的文件。这些数字来自于递增计数器,但是为了使它们在目录中很好地排序,我想在文件名中使用前导零。换句话说
file_001……
而不是
file_1
在将数字转换为字符串时,是否有简单的方法添加前导零?(我知道我能做到”如果少于10....如果小于100”)。
使用带有字符串的%操作符:
%
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格式备忘单,你可能会发现在形成你的格式字符串时很有用。printf格式最初来自C函数printf,但类似的格式化函数在perl、ruby、python、java、php等中都可用。
C
printf
难道不能在连接文件名之前使用值的字符串格式化吗?
"%03d" % number
如果已知计数器中的最大数字数(例如,对于计数器1..876,n = 3),则可以执行
str = "file_" + i.to_s.rjust(n, "0")
使用String#next作为计数器。
String#next
>> n = "000" >> 3.times { puts "file_#{n.next!}" } file_001 file_002 file_003
next相对“聪明”,这意味着你甚至可以去
next
>> n = "file_000" >> 3.times { puts n.next! } file_001 file_002 file_003
正如其他答案所述,"%03d" % number工作得很好,但它与rubocop Ruby风格指南相悖:
赞成使用sprintf及其别名格式,而不是公平 cryptic String#%方法
我们可以使用以下更易读的方式获得相同的结果:
format('%03d', number)
filenames = '000'.upto('100').map { |index| "file_#{index}" }
输出
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]