Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中输出前导零?_Ruby - Fatal编程技术网

如何在Ruby中输出前导零?

如何在Ruby中输出前导零?,ruby,Ruby,我正在从Ruby脚本输出一组编号文件。这些数字来自计数器的递增,但是为了使它们在目录中很好地排序,我想在文件名中使用前导零。换句话说 文件001 而不是 文件1 在将数字转换为字符串时,是否有一种简单的方法来添加前导零?(我知道我可以执行“如果小于10…如果小于100”)。使用带字符串的%运算符: irb(main):001:0> "%03d" % 5 => "005" 左侧是printf格式字符串,右侧可以是值列表,因此可以执行以下操作: irb(main):002:0>

我正在从Ruby脚本输出一组编号文件。这些数字来自计数器的递增,但是为了使它们在目录中很好地排序,我想在文件名中使用前导零。换句话说

文件001

而不是

文件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格式最初来自
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。感谢您指出这一点。这是一个非常棒的方法。