【问题标题】:Ruby average value of array of time values (fixnums)时间值数组的 Ruby 平均值(fixnums)
【发布时间】:2011-12-10 11:29:53
【问题描述】:

希望获得平均持续时间,其中持续时间的形式为 1.day、3.months、2.weeks 格式..

# provided array
a = [1.day, 3.days, 1.week, 4.days]

# desired output
a.average = "3 days"

我尝试过的任何方式都会在几秒钟内输出..例如:

a.inject(:+) = "15 days"
a.inject(:+) / a.size = 324000

我查看了 Linguistics gem,但它只将值输出为数字(32.4 万)

【问题讨论】:

    标签: ruby-on-rails arrays time


    【解决方案1】:
    def average_days(a)
      seconds = a.inject(:+) / a.size
      minutes = seconds / 60
      days    = (minutes / 1440).round
      "#{days} days"
    end
    

    【讨论】:

    • 这在几天内运行良好,但如果持续时间是几个月、几年、几十年、几百年、几千年或亿万年呢?
    • 案例;当天数 > 30 则 "#{(days/30).round} 月";当天数 > 365 则 "#{(days/365).round} 年"; else "#{days} 天"
    • 这取决于您最终要寻找什么。如果您想显示一个漂亮的、人类可读的时间跨度,并且您不介意最终结果确实是String 而不再是Integer,那么您可以使用Fixnum.distance_of_time_in_words。传入一个 int,它会为您提供一个具有适当单位的友好字符串。缺点是它增加了“差不多 3 年”之类的近似值,这可能不需要。
    • @jdl Fixnum.distance_of_time_in_words ?您的意思是 ActionView::Helpers::DateHelper 的 distance_of_time_in_words 方法?我想这可能行得通,我最终不得不在模型中包含那个视图助手..
    • 实际上,它是 Rails 3 中 Fixnum 的一部分。如果您使用的是 Rails 2.3,那么 DateHelper 可能是您最好的选择。
    【解决方案2】:
    > a = [1.day, 3.days, 1.week, 4.days]
    > (a.inject(0.0) {|sum, n| sum + n} / a.size) / (60 * 60 * 24)
     => 3.75 
    

    如果你坚持。随意舍入和/或截断。

    ((a.inject(0.0) {|sum, n| sum + n} / a.size) / (60 * 60 * 24)).days
    

    【讨论】:

    • 3.75 什么?同样,所需的输出是“3 天”。如果您在控制台中输入“3.days”,则输出为“3 天” - 我想要平均值的类似输出...
    • 3.75 天。用舍入、截断等值做任何你想做的事情。15 天/4 不是“3 天”。这是“3.75 天”。您没有指定要如何处理舍入。
    • 其实15/4 IS 3,15.0/4.0就是3.75,是个整数。您的侮辱性评论对社区没有帮助,您的回答也没有帮助,这显然不能完全回答我的问题。
    • @rabbott 如果您希望将所有内容保留为整数,您只需将注入中的0.0 更改为0
    猜你喜欢
    • 2018-03-11
    • 2022-11-12
    • 2019-03-07
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2013-12-11
    • 2021-09-15
    • 2020-12-15
    相关资源
    最近更新 更多