将数字限制为上限/下限?

时间:2010-06-16 17:44:00

标签: ruby-on-rails ruby

是否有内置方式或更优雅的方法将数字 num 限制为Ruby或Rails中的上限/下限?

e.g。类似的东西:

def number_bounded (num, lower_bound, upper_bound)
  return lower_bound if num < lower_bound
  return upper_bound if num > upper_bound
  num
end

4 个答案:

答案 0 :(得分:13)

这是一个聪明的方法:

[lower_bound, num, upper_bound].sort[1]

但那不是很可读。如果你只需要做一次,我就会做

num < lower_bound ? lower_bound : (num > upper_bound ? upper_bound : num)

或者如果您需要多次,请对可比模块进行修补:

module Comparable
  def bound(range)
     return range.first if self < range.first
     return range.last if self > range.last
     self
  end
end

所以你可以像

一样使用它
num.bound(lower_bound..upper_bound)

您也可以只需要ruby facets,这会添加一个方法clip来实现此目的。

答案 1 :(得分:12)

您可以使用min和max来使代码更简洁:

number_bounded = [lower_bound, [upper_bound, num].min].max

答案 2 :(得分:1)

class Range

  def clip(n)
    if cover?(n)
      n
    elsif n < min
      min
    else
      max
    end
  end

end

答案 3 :(得分:0)

由于你提到了Rails,我将提到如何通过验证来实现这一点。

validates_inclusion_of :the_column, :in => 5..10

当然,这不会自动调整数字。