将十进制数转换为几周和几天?

时间:2014-07-21 18:13:57

标签: ruby-on-rails ruby

如何将小数转换为数周和数天?

例如,取这个号码:12.4893617021277

12是月数。然后.4893617021277将是数周和数天。

所以我希望输出类似于:12 months, 1 week and 6 days

为了澄清,我不在这里寻找确切的号码。我假设一个月有4周,一周有7天。

original = 12.4893617021277
4 weeks × .489361702127658 = 1.9574468085 weeks # That gives me 1 full week, with the remainder going in to the number of days
7 days in a week × .9574468085 = 6.7021276595 days

最终翻译= 12 months, 1 week and 6 days

我正在运行Ruby 2.1.2并运行Rails 4(如果有一些我不知道的随机助手)。

2 个答案:

答案 0 :(得分:1)

另一个解决方案,很清楚。

def integer_and_decimal_part(float)
    integer = float.to_i
    decimal = float - float.to_i
    [integer, decimal]
end

def calculate(float)
    months, months_decimal = integer_and_decimal_part(float)
    weeks, weeks_decimal = integer_and_decimal_part(4*(months_decimal))
    days = (7*weeks_decimal).to_i

    {months: months, weeks: weeks, days: days}
end

calculate(12.4893617021277)

=> {:months=>12, :weeks=>1, :days=>6}

答案 1 :(得分:0)

我没有得到12个月,1个星期& 6天 - 30 * .4893617即将推出14.6天,这将是2周,对吗?我的解决方案并不是最漂亮但却有效。

def num_to_date(val)
  results = {}
  results[:month] = val.to_i
  remain = val % val.to_i
  days = remain * 30 #30 days in a month
  if days > 7
    results[:weeks] = days.to_i / 7
    rem = days % days.to_i
    rem < 0 ? results[:days] = 0 : results[:days] = rem.to_i
  else
    results[:weeks] = 0
    results[:days] = days
  end
  results
end

num = 12.4893617021277
puts num_to_date(num)

输出:

{:month=>12, :weeks=>2, :days=>0}