2010-06-16 99 views
11

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

例如是这样的:

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

回答

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这样做。

+0

谢谢,我可能会去Ruby Facets路线。 – Amy 2010-06-16 22:56:51

12

您可以使用最小值和最大值,使代码更简洁:

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

这可能是比sort()版本更快的方法。谢谢。 – Amy 2010-06-16 22:57:38

0

既然你提到了Rails,我会提到如何通过验证来做到这一点。

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

这当然不会自动调整数量。

1
class Range 

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

end