我有一个具有持续时间属性的Track
模型。该属性是基于字符串的,并以minutes:seconds
格式读取。我想知道采用这些基于字符串的值并将它们加在一起的最佳方法是什么。例如,如果有持续时间值如下:
Duration 1: "1:00"
Duration 2: "1:30"
我怎样才能输出"2:30"
?
我发现的与此问题相关的大多数问题都以基于整数的值开头。完成这项工作的最佳方法是什么?
答案 0 :(得分:3)
我的建议是以秒为单位存储/操作它们。
它绝对更容易将它们存储为整数秒,并应用函数将值解析/格式化为正确的字符串表示。
将它们存储为整数将使得它很容易求和并减去它们。
答案 1 :(得分:2)
以下是一种方法:
class Track
attr_accessor :duration
def initialize(duration)
@duration = duration
end
end
arr = [Track.new("1:00"), Track.new("1:30")]
total_seconds = arr.reduce(0) do |a, i|
min, sec = i.duration.split(":").map(&:to_i)
a + min * 60 + sec
end
p total_duration = '%d:%02d' % total_seconds.divmod(60)
#=> "2:30"
答案 2 :(得分:1)
编辑:我错过了@Wand的早期答案,这与我的答案相同。我会以我组织计算的方式离开我。
arr = %w| 1:30 3:07 12:53 |
#=> ["1:30", "3:07", "12:53"]
"%d:%2d" % arr.reduce(0) do |tot,str|
m,s = str.split(':')
tot + 60*m.to_i + s.to_i
end.divmod(60)
#=> "17:30"
答案 3 :(得分:0)
我只是在最近的一个项目中实现了这样的东西。这是一个简单的开始。如果您确定自己始终拥有此格式' H:S',则无需将持续时间转换为时间对象:
entries = ["01:00", "1:30", "1:45"]
hours = 0
minutes = 0
entries.each do |e|
entry_hours, entry_minutes = e.split(':', 2)
hours += entry_hours.to_i
minutes += entry_minutes.to_i
end
hours += (minutes/60)
minutes = (minutes%60)
p "#{hours}:#{minutes}"
#=> "4:15"
答案 4 :(得分:0)
我同意@SimoneCarletti:将它们存储为整数秒。但是,您可以将它们包装在持续时间值类中,该类可以将其自身输出为格式良好的字符串。
class Duration
attr_accessor :seconds
def initialize(string)
minutes, seconds = string.split(':', 2)
@seconds = minutes.to_i * 60 + seconds.to_i
end
def to_s
sprintf("%d:%02d", @seconds / 60, @seconds % 60)
end
def self.sum(*durations)
Duration.new(durations.reduce(0) { |t,d| t + d.seconds })
end
end
编辑:添加了类似于@CarySwoveland建议的和方法。您可以按如下方式使用它:
durations = ["1:30", "2:15"].map { |str| Duration.new(str) }
total = Duration.sum *durations