Как разделить время в формате с плавающей точкой (ччмм) на целое число в рубине? - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь разделить время в формате с плавающей точкой (ччмм) на целое число.Например, 1,30 на 2 должно дать 00,45.Есть ли простой способ сделать это?

Ответы [ 4 ]

7 голосов
/ 11 июля 2019

Использование числа с плавающей точкой для выражения h.mm немного необычно.Обычно вы используете строки для форматирования.

Однако я бы начал с извлечения часов и минут из значения с плавающей запятой.Для этого я бы преобразовал число с плавающей запятой в строку, используя format:

time = 1.3
time_str = format('%.2f', time)
#=> "1.30"

Тогда я бы split строка в .чтобы получить часть часов и часть минут и позвонить to_i, чтобы преобразовать их в действительные целые числа: (я использую map здесь, вы также можете позвонить h = h.to_i /m = m.to_i впоследствии)

h, m = time_str.split('.').map(&:to_i)
h #=> 1
m #=> 30

Теперь, когда у нас есть числа 1 и 30 как целые числа, мы можем легко вычислить общую продолжительность в минутах:

duration = h * 60 + m
#=> 90

Iзатем разделил бы продолжительность на 2 (или любое другое значение):

duration /= 2
#=> 45

и преобразовал бы его обратно в часы и минуты, используя divmod: (он возвращает оба значения одновременно)

h, m = duration.divmod(60)
h #=> 0
m #=> 45

Мы можем отформатировать их в виде строки:

format('%02d.%02d', h, m)
#=> "00.45"

или преобразовать обратно в число с плавающей запятой:

time = h + m.fdiv(100)
#=> 0.45

Которые можно отформатировать так:

format('%05.2f', time)
#=> "00.45"
2 голосов
/ 11 июля 2019
time    = 1.3
divisor = 2

hr, min = (time.fdiv(divisor)).divmod(1)
  #=> [0, 0.65]
min = (60 * min).round
  #=> 39 
"%02d.%02d" % [hr, min]
  #=> "00.39"

Другой пример.

time    = 1005
divisor =    5

hr, min = (time.fdiv(divisor)).divmod(1)
  #=> [201, 0.0] 
"%02d.%02d" % [hr, (60 * min).round]
  #=> "201.00" 

См. Integer # fdiv , Float # fdiv , Integer # divmod и Integer # круглый .divmod - чрезвычайно полезный метод, который, по причинам, которые я не понимаю, кажется недостаточно используемым.

0 голосов
/ 11 июля 2019

Вы можете попробовать следующее:

num = 1.3

splitted_values = ('%.2f' % num).split('.').map(&:to_i) => [1, 30]

((splitted_values[0] * 60) / 2) + (splitted_values[1] / 2 ) => 45
0 голосов
/ 11 июля 2019

Может быть, вы можете разбить на массив потом:

n = 2
[1, 30].then { |h, m| [h / n, (m + h % n * 60) / n]}
#=> [0, 45]

Для разбиения:

num = 1.3
('%.2f' % num).split('.').map(&:to_i) #=> [1, 30]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...