Необходимо преобразовать в целое число, а затем в сумму сорванных данных ruby 2,6 - PullRequest
0 голосов
/ 17 марта 2020

Мне нужна СУММА сорванных таймингов.

Я сделал

@dailystatus_infos.task_times.pluck(:total_min)

Я получил следующий вывод

["00:00:00", "1:52:00", "00:00:00", "00:02:28", "1:54:00"]

. [Hour:Minute:Second] format

Теперь мне нужно преобразовать эти минуты в целое число и его сумму.

Ответы [ 4 ]

2 голосов
/ 17 марта 2020

Сначала мы определяем общее количество секунд:

arr = ["00:00:00", "1:52:00", "00:00:00", "00:02:28", "1:54:00"]

s = arr.sum do |str|
  str.split(':').reduce(0) { |t, s| t * 60 + s.to_i }
end
  #=> 13708

, а затем манипулируем s по желанию. Например, количество минут равно

s.fdiv(60)
  #=> 228.46666666666667

, которое может быть округлено или усечено.

2 голосов
/ 17 марта 2020

Мне нужно СУММУ сорванных значений времени

Я бы начал с написания вспомогательного метода для преобразования строки hh:mm:ss в секунды. Будет работать регулярное выражение:

def to_seconds(string)
  string.match(/(?<hours>\d+):(?<minutes>\d+):(?<seconds>\d+)/) do |m|
    m[:hours].to_i * 3600 + m[:minutes].to_i * 60 + m[:seconds].to_i
  end
end

to_seconds('00:00:12') #=> 12
to_seconds('00:01:00') #=> 60
to_seconds('00:01:12') #=> 72

Теперь вы можете sum секунд через:

total_mins = ["00:00:00", "1:52:00", "00:00:00", "00:02:28", "1:54:00"]

total_mins.sum { |str| to_seconds(str) }
#=> 13708

И, при необходимости, преобразовать это обратно в h:mm:ss через divmod:

seconds = 13708

hours, seconds = seconds.divmod(3600)
minutes, seconds = seconds.divmod(60)

format('%d:%02d:%02d', hours, minutes, seconds)
#=> "3:48:28"
0 голосов
/ 17 марта 2020

как то так

total_minutes = @dailystatus_infos.task_times.pluck(:total_min)
total_minutes.map { |t| (::Time.parse(t).seconds_since_midnight / 60).to_i }.sum

arr = ["00:00:00", "1:52:00", "00:00:00", "00:02:28", "1:54:00"]

arr.map { |t| ::Time.parse(t).seconds_since_midnight / 60 }.sum.to_i
=> 228

0 голосов
/ 17 марта 2020

Вы получаете минуты, разделив на :. Тогда map и sum.

ary = ["00:00:00", "1:52:00", "00:00:00", "00:02:28", "1:54:00"]
ary.map{ |s| s.split(':')[1].to_i }.sum #=> 108 (0 + 52 + 0 + 2 + 54)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...