【问题标题】:How to make single digit number a two digit number in ruby?如何在红宝石中将一位数变成两位数?
【发布时间】:2011-09-17 20:31:35
【问题描述】:

Time.new.month 返回 10 月之前任何月份的一位数表示(例如,六月是 6),但我想要一个两位数的格式(即,我想要 06 而不是 6)。

我编写了以下解决方案,并要求查看其他/更好的解决方案。

s = 6.to_s; s[1]=s[0]; s[0] = '0'; s #=> '06'

【问题讨论】:

    标签: ruby number-formatting


    【解决方案1】:

    为了你的需要,我认为最好的仍然是

    Time.strftime("%m")
    

    如前所述,但对于一般用例,我使用的方法是

    str = format('%02d', 4)
    puts str
    

    根据上下文我也使用这个做同样的事情:

    str = '%02d %s %04d' % [4, "a string", 56]
    puts str
    

    这里是所有支持格式的文档:http://ruby-doc.org/core-2.3.1/Kernel.html#method-i-sprintf

    【讨论】:

    • 这在使用像 Forgery 这样的随机生成器时非常有用。 month = '%02d' % (Forgery(:date).month :numerical=>true);day = '%02d' % (Forgery(:date).day)
    【解决方案2】:

    您可以使用类似printf 的语法:

    irb> '%02d' % 6
    => "06"
    

    str = '%02d' % 6
    

    所以:

    s = '%02d' % Time.new.month
    => "06"
    

    请参阅String#% 的文档。

    【讨论】:

      【解决方案3】:

      Mat 的回答指出您可以使用 % 运算符很棒,但我想指出另一种方法,使用 String 类的 rjust 方法:

      str = 6.to_s.rjust(2,'0')  # => "06"
      

      【讨论】:

      • 工作非常适合将月份整数转换为长月份数
      【解决方案4】:

      如果您尝试格式化整个日期或日期和时间(而不仅仅是月份),您可能需要使用strftime

      m = Time.now.strftime('%m')
      # => "06"
      t = Time.now.strftime('%Y-%m-%dT%H:%M:%SZ%z')
      # => "2011-06-18T10:56:22Z-0700"
      

      这将使您可以轻松访问所有常用的日期和时间格式。

      【讨论】:

        【解决方案5】:

        你可以使用 sprintf:

        sprintf("%02d", s)
        

        例如在 irb 中:

        >> sprintf("%02d", s)
        => "06"
        

        【讨论】:

        • Kernal.sprintf 和 Kernal.format 是同一个东西吗? ruby在线文档把两者放在同一个地方,是不是互为别名?
        • @yozloy:是的,Kernel.sprintfKernel.formatString#% 是一回事,而且几乎是一回事。
        猜你喜欢
        • 2011-02-06
        • 2011-07-30
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 2017-04-01
        • 2010-12-14
        • 2012-06-21
        • 1970-01-01
        相关资源
        最近更新 更多