如何在Ruby中输出前导零?

Nat*_*ong 228 ruby

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

file_001 ...

代替

file_1

在将数字转换为字符串时,是否有一种简单的方法可以添加前导零?(我知道我可以"如果少于10 ......如果少于100").

Dan*_*tin 338

使用%带字符串的运算符:

irb(main):001:0> "%03d" % 5
=> "005"
Run Code Online (Sandbox Code Playgroud)

左侧是printf格式字符串,右侧可以是值列表,因此您可以执行以下操作:

irb(main):002:0> filename = "%s/%s.%04d.txt" % ["dirname", "filename", 23]
=> "dirname/filename.0023.txt"
Run Code Online (Sandbox Code Playgroud)

这是一个printf格式的备忘单,您可能会发现它在形成格式字符串时很有用.printf格式最初来自C函数printf,但在perl,ruby,python,java,php等中提供了类似的格式化函数.

  • BTW - 这与调用`Kernel #sprintf`相同,这里记录了:http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf (2认同)

ale*_*dev 265

如果计数器中的最大位数已知(例如,对于计数器1..876,n = 3),则可以这样做

str = "file_" + i.to_s.rjust(n, "0")
Run Code Online (Sandbox Code Playgroud)

  • 嘿嘿,不是最好的答案,但我不知道rjust,我多年来一直在使用红宝石.干杯! (7认同)

Óla*_*age 49

在连接文件名之前,你不能只使用值的字符串格式吗?

"%03d" % number
Run Code Online (Sandbox Code Playgroud)

  • 他和Daniel Martin在同一时间回答,所以可能没有意识到重复. (3认同)

tes*_*str 28

使用String#next作为计数器.

>> n = "000"
>> 3.times { puts "file_#{n.next!}" }
file_001
file_002
file_003
Run Code Online (Sandbox Code Playgroud)

next 是相对'聪明',这意味着你甚至可以去

>> n = "file_000"
>> 3.times { puts n.next! }
file_001
file_002
file_003
Run Code Online (Sandbox Code Playgroud)


Rod*_*los 6

如其他答案所述,"%03d" % number效果很好,但是与rubocop 红宝石风格指南背道而驰:

相对于相当神秘的String#%方法,建议使用sprintf及其别名格式

我们可以使用以下方法以更易读的方式获得相同的结果:

format('%03d', number)
Run Code Online (Sandbox Code Playgroud)

  • RuboCop 的默认配置实现了 Ruby 社区风格指南 (https://github.com/rubocop-hq/ruby-style-guide)。我对 RuboCop 是“一个晦涩的 Ruby 语言功能”的观点提出质疑。如果 C 程序员更好的可读性对您的项目很重要,那么自定义 cop 配置是个好主意;它可以根据个人需求进行定制,而 Ruby 不鼓励“一种方法”的心态!但是,遵循社区风格指南无疑是 Ruby 的惯用方式。 (4认同)
  • 我经历了同样的循环,根据 RuboCop 的建议将 `"%02d" % num` 更改为 `sprintf(...)`,然后更改为 `format(...)`。然后我认为 `sprintf` 比 `format` 更传统,因此用 `Style/FormatString: E​​nforcedStyle: sprintf` 更新了 rubocop.yml,现在我晚上睡得很好。 (3认同)
  • 那是Ruby样式指南,而不是Ruby样式指南。 (2认同)