我正在使用Ruby脚本输出一组带编号的文件。编号来自于递增计数器,但为了使它们在目录中排序得好看些,我想在文件名中使用前导零。也就是说
file_001...
而不是
file_1
是否有简单的方法将数字转换为字符串时添加前导零?(我知道可以通过“if less than 10.... if less than 100”来实现)。
我正在使用Ruby脚本输出一组带编号的文件。编号来自于递增计数器,但为了使它们在目录中排序得好看些,我想在文件名中使用前导零。也就是说
file_001...
而不是
file_1
是否有简单的方法将数字转换为字符串时添加前导零?(我知道可以通过“if less than 10.... if less than 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等语言中使用。
str = "file_" + i.to_s.rjust(n, "0")
%
能够实现相同的功能,但是更加通用。 - Nathan Longerror: '0' flag used with ‘%s’ gnu_printf format [-Werror=format=]
... 所以,不管你是否发誓,要么你弄错了,要么它已经改变了,要么... 至少有一个现代编译器不同意。 :) - undefined在拼接文件名之前,你不能只使用值的字符串格式化吗?
"%03d" % number
使用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
如其他答案所述,"%03d" % number
的确可以很好地工作,但它违反了 rubocop Ruby 风格指南 :
更喜欢使用 sprintf 及其别名 format,而不是相当难懂的 String#% 方法。
我们可以使用以下方法以更可读的方式获得相同的结果:
format('%03d', number)
format
。但是如果你的目标是让代码易于理解,应该使用sprintf
,因为它是C标准库的一部分,并且跨多种编程语言使用。了解sprintf
的人比知道format
是其别名的人要多得多。仅仅因为某个规则是RuboCop的一部分并不意味着它本质上是对还是错。选择最适合你项目的规则。而'%03d' % number
更容易阅读。 - Tilo"%02d" % num
改为sprintf(...)
,然后按照RuboCop的建议再改为format(...)
。之后我决定使用sprintf
比format
更传统,所以在rubocop.yml中更新了Style/FormatString: EnforcedStyle: sprintf
,现在晚上我能睡个好觉了。 - David Hempyfilenames = '000'.upto('100').map { |index| "file_#{index}" }
输出结果
[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]
Kernel#sprintf
相同,其文档在此处:http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf - Nathan Longsprintf("%03d", 5)
。 - Dennis