How can I output leading zeros in Ruby?

前端 未结 6 359
攒了一身酷
攒了一身酷 2021-01-29 18:31

I\'m outputting a set of numbered files from a Ruby script. The numbers come from incrementing a counter, but to make them sort nicely in the directory, I\'d like to use leading

相关标签:
6条回答
  • 2021-01-29 19:03

    Use String#next as the counter.

    >> n = "000"
    >> 3.times { puts "file_#{n.next!}" }
    file_001
    file_002
    file_003
    

    next is relatively 'clever', meaning you can even go for

    >> n = "file_000"
    >> 3.times { puts n.next! }
    file_001
    file_002
    file_003
    
    0 讨论(0)
  • 2021-01-29 19:12

    Use the % operator with a string:

    irb(main):001:0> "%03d" % 5
    => "005"
    

    The left-hand-side is a printf format string, and the right-hand side can be a list of values, so you could do something like:

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

    Here's a printf format cheat sheet you might find useful in forming your format string. The printf format is originally from the C function printf, but similar formating functions are available in perl, ruby, python, java, php, etc.

    0 讨论(0)
  • 2021-01-29 19:13

    Can't you just use string formatting of the value before you concat the filename?

    "%03d" % number
    
    0 讨论(0)
  • 2021-01-29 19:13

    filenames = '000'.upto('100').map { |index| "file_#{index}" }

    Outputs

    [file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]

    0 讨论(0)
  • 2021-01-29 19:21

    As stated by the other answers, "%03d" % number works pretty well, but it goes against the rubocop ruby style guide:

    Favor the use of sprintf and its alias format over the fairly cryptic String#% method

    We can obtain the same result in a more readable way using the following:

    format('%03d', number)
    
    0 讨论(0)
  • 2021-01-29 19:23

    If the maximum number of digits in the counter is known (e.g., n = 3 for counters 1..876), you can do

    str = "file_" + i.to_s.rjust(n, "0")
    
    0 讨论(0)
提交回复
热议问题