如何格式化持续时间字符串以包含零字段的两个零?

时间:2017-07-11 14:22:46

标签: ruby-on-rails string format duration

在Ruby 2.4中使用Rails 5.0.1。我有一个方法,以毫秒为单位显示格式化字符串。

~$ docker exec -it apksplashcompose_splash_1 /bin/bash
root@b091fbef4c78:/# cd /etc/splash/proxy-profiles
root@b091fbef4c78:/etc/splash/proxy-profiles# ls
proxy.ini
root@b091fbef4c78:/etc/splash/proxy-profiles# cat proxy.ini
[proxy]

host=tor-privoxy
port=8118
但是,我有点麻烦,因为如果分钟或秒字段为零,则输出显示为" 0"而不是" 00"。例如,如果我用

调用该函数
def time_as_str(time_in_ms)
  secs, ms    =   time_in_ms.divmod(1000)
  mins, secs  = secs.divmod(60)
  hours, mins = mins.divmod(60)
  s = "%d:%d:%d.%s" % [hours, mins, secs, ms.zero? ? "0" : ms.to_s.sub(/0*\z/,'')]
  if hours > 0
    s
  elsif mins > 0
    s[2..-1]
  else
    s[4..-1]
  end
end

(即24小时内的毫秒数),输出为

86400000

但我希望它是

"24:0:0.0"

同样,如果输入是

"24:00:00"

输出应该是

1000

因为一千毫秒等于一秒。如果需要,如何正确格式化输出以包含两个零?

1 个答案:

答案 0 :(得分:0)

您可以按如下方式使用它:

def time_as_str(time_in_ms)
  secs, ms    =   time_in_ms.divmod(1000)
  mins, secs  = secs.divmod(60)
  hours, mins = mins.divmod(60)
  s = "%d:%02d:%02d%s" % [hours, mins, secs, ms.zero? ? "" : "."+ms.to_s.sub(/0*\z/,'')]
  (hours > 0 ? s : mins > 0 ? s[2..-1] : s[5..-1]).sub(/^0/,"")
end

基本上%会插入你传递的任何内容,%d表示打印为数字,%02d打印为占据至少2位数的数字,左边打用0,直到至少2位数字为止。然后,如果没有%sms,您将希望ms=0实际打印空字符串,如果不打印左侧带点的ms字符串。

我认为您应该在format/interpolate字符串之前确定ms保留的内容,这样您就不需要在format数组中调用三元运算符。