2010-06-16 146 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