【发布时间】: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'
【问题讨论】:
Time.new.month 返回 10 月之前任何月份的一位数表示(例如,六月是 6),但我想要一个两位数的格式(即,我想要 06 而不是 6)。
我编写了以下解决方案,并要求查看其他/更好的解决方案。
s = 6.to_s; s[1]=s[0]; s[0] = '0'; s #=> '06'
【问题讨论】:
为了你的需要,我认为最好的仍然是
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
【讨论】:
month = '%02d' % (Forgery(:date).month :numerical=>true);day = '%02d' % (Forgery(:date).day)
您可以使用类似printf 的语法:
irb> '%02d' % 6
=> "06"
或
str = '%02d' % 6
所以:
s = '%02d' % Time.new.month
=> "06"
请参阅String#% 的文档。
【讨论】:
Mat 的回答指出您可以使用 % 运算符很棒,但我想指出另一种方法,使用 String 类的 rjust 方法:
str = 6.to_s.rjust(2,'0') # => "06"
【讨论】:
如果您尝试格式化整个日期或日期和时间(而不仅仅是月份),您可能需要使用strftime:
m = Time.now.strftime('%m')
# => "06"
t = Time.now.strftime('%Y-%m-%dT%H:%M:%SZ%z')
# => "2011-06-18T10:56:22Z-0700"
这将使您可以轻松访问所有常用的日期和时间格式。
【讨论】:
你可以使用 sprintf:
sprintf("%02d", s)
例如在 irb 中:
>> sprintf("%02d", s)
=> "06"
【讨论】:
Kernel.sprintf 和 Kernel.format 和String#% 是一回事,而且几乎是一回事。