如何在Ruby中输出前导零?
我正在从Ruby脚本输出一组编号文件。这些数字来自计数器的递增,但是为了使它们在目录中很好地排序,我想在文件名中使用前导零。换句话说 文件001 而不是 文件1如何在Ruby中输出前导零?,ruby,Ruby,我正在从Ruby脚本输出一组编号文件。这些数字来自计数器的递增,但是为了使它们在目录中很好地排序,我想在文件名中使用前导零。换句话说 文件001 而不是 文件1 在将数字转换为字符串时,是否有一种简单的方法来添加前导零?(我知道我可以执行“如果小于10…如果小于100”)。使用带字符串的%运算符: irb(main):001:0> "%03d" % 5 => "005" 左侧是printf格式字符串,右侧可以是值列表,因此可以执行以下操作: irb(main):002:0>
在将数字转换为字符串时,是否有一种简单的方法来添加前导零?(我知道我可以执行“如果小于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格式最初来自C
函数printf
,但类似的格式化函数在perl、ruby、python、java、php等中都可用。您不能在转换文件名之前使用该值吗
"%03d" % number
如果已知计数器中的最大位数(例如,对于计数器1..876,n=3),则可以执行以下操作
str = "file_" + i.to_s.rjust(n, "0")
用作计数器
>> 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相反:
使用sprintf及其别名格式优于
神秘字符串#%method
我们可以使用以下方法以更易读的方式获得相同的结果:
format('%03d', number)
filenames='000'。最多('100')。映射{|索引|“文件{index}”}
输出
[文件000,文件001,文件002,文件003,…,文件098,文件099,文件100]
太棒了!所以“%s”的意思是“在这里替换第n个值”,“03d”的意思是“在这里替换一个数字,根据需要添加尽可能多的零以使其成为一个3位数的数字?”(我猜d的意思是“数字”)。我现在看到了关于这个的文档(),但它非常简洁,我希望有一点详细说明。我添加了一个指向printf格式备忘单的链接。“s”表示“字符串”,“d”表示“十进制数”。“03”表示“用零填充到3个字符”;“%3d”将在左边填充空格。顺便说一句-这与调用内核#sprintf
相同,这里有文档记录:添加到@NathanLong的注释中,这个答案中的第一个示例将被写成sprintf(“%03d”,5)
。这应该是选中的答案。呵呵,不是最好的答案,但我不知道rjust,我已经使用ruby很多年了。干杯必须对此进行投票,因为%03s似乎出于某种奇怪的原因使用空格填充(%03d似乎工作正常)。我可以发誓在这两种情况下都用零填充C。最后,我把它变成了公认的答案,因为它是最简单、最容易记住的<代码>%可以工作,但更具通用性。请在此查看如何填充基数为36的数字。这是可行的,而%看起来不会。谢谢我认为这个答案并没有给@Daniel Martin的答案增加任何内容,但我喜欢它的简单性……他与Daniel Martin在同一分钟内回答,因此可能不知道重复。这对于utc_Offseti来说是完美的。如果您的目标是学习一种晦涩难懂的Ruby语言功能,那么请使用别名格式
。如果您的目标是使代码易于理解,那么应该使用sprintf
,因为它是标准C库的一部分。此名称在编程语言中使用。与知道format
是sprintf的别名的人相比,更多的人了解sprintf
的功能。仅仅因为某些东西是RuboCop的一部分,并不意味着它本身就是对的或错的。选择对项目最有意义的规则<代码>'%03d'%number更容易阅读。我也经历了同样的循环,根据RuboCop的建议将%02d'%num
更改为sprintf(…)
,然后更改为格式(…)
。然后我决定sprintf
比format
更传统,所以用Style/FormatString:EnforcedStyle:sprintf
更新了rubocop.yml,现在我晚上睡得很好。我会质疑RuboCop是“一个模糊的Ruby语言特性”的说法。如果C程序员更好的可读性对您的项目很重要,那么定制cop配置是一个好主意;它是为满足个人需求而定制的,Ruby不鼓励“单干”的心态!但是,遵循社区风格指南肯定是惯用的Ruby。感谢您指出这一点。这是一个非常棒的方法。