如何在Ruby中使用百分号格式化字符串输出?

6
我想在Ruby中格式化字符串输出。我可以使用%来实现,但我无法弄清楚如何做到这一点。
与其输出“201107070928”,我希望输出“2011\07\070928”。
puts "%.4s\\%.2s\\%s" % "201107070928"

出现错误:`%':参数太少(ArgumentError)


2个回答

10

这并不是格式化日期的正确方法。使用 % 格式化日期的方式是:

puts "%.4s\\%.2s\\%s" % ["1","2","3"]
所以,你需要多个参数 - 每个格式说明符一个。
如果你需要从字符串日期打印和格式化日期,请先将字符串转换为日期/时间对象,然后使用 strftime:
假设输入是日期和时间:
Time.parse("201107070928").strftime("%Y\\%m\\%d%H%M"). 

2
s = "201107070928"; puts "%s\%s\%s" % [ s[0...4], s[4...6], s[6..-1] ] => 2011\07\070928 - Paul Annesley
1
假设输入是日期和时间:Time.parse("201107070928").strftime("%Y\\%m\\%d%H%M") - Zabba
1
如果您知道字符串始终是该格式,请查看http://www.ruby-doc.org/core/classes/String.html#M001112 ... "201107070928".unpack("a4a2a6").join('/')。 请注意,这只是计算机程序代码的一部分,翻译可能不足以理解完整上下文。 - DGM
2
或者,使用正则表达式将字符串拆分为所需的部分,然后对MatchData进行任何操作:puts“%s \\%s \\%s”%“201107070928”。match(/(\ d {4})(\ d {2})(\ d *)/)。to_a [1..-1] - Paul Annesley
我想补充一下@PaulAnnesley的答案,使用join函数:"201107070928".match(/^([0-9]{4})([0-9]{2})([0-9]*)$/).to_a[1..-1].join("/") - Ludovic Kuty
显示剩余2条评论

5

我将把这个答案放在回答中而不是评论中,因为我对这种可能性更为印象深刻。使用String#unpack,我们可以处理一个4位数字/2位数字/任何内容:

"201107070928345345345".unpack("a4a2a*").join('/')
 => "2011/07/070928345345345"

我对解包也非常满意 :-) - Radek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接