如何检查一个范围内是否包含数字(在一个语句中)?


85

我正在使用Ruby on Rails 3.0.9,我想检查范围内是否包含数字。也就是说,如果我有一个变量,number = 5我想检查1 <= number <= 10并检索一个布尔值(如果该number值包含在该范围内)。

我可以这样:

number >= 1 && number <= 10

但我想在一份声明中做到这一点。我怎样才能做到这一点?


既然您引用的声明没有错,所以提出了一个问题:为什么要/需要进一步“缩短”它?
DarkDust

1
@DarkDust-尽可能少的代码!
Backo 2011年

Answers:


161

(1..10).include?(number) 是诀窍。

顺便说一句:如果您想使用验证号码ActiveModel::Validations,您甚至可以执行以下操作:

validates_inclusion_of :number, :in => 1..10

在此处阅读有关validates_inclusion_of的信息

或Rails 3+方式:

validates :number, :inclusion => 1..10

如果我也想允许零怎么办?零时出现错误。
user2503775 2014年

5
Rails有一个选择allow_nil。像这样添加即可:, allow_nil: true
Mario Uher 2014年

64

可枚举的#include?

(1..10).include? n

范围#cover?

(1..10).cover? n

可比#之间?

n.between? 1, 10

数值验证器

validates :n, numericality: {only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 10}

包含验证器

validates :n, inclusion: 1..10

1
我更喜欢这种方法,因为验证文本更有意义。
2013年

我更喜欢它,因为我已经在验证数值。使它成为一行:)
BradGreens 2013年

@BradGreens那是一长行。
wchargin 2013年

1
我想指出的是,如果您需要一些特定的逻辑或访问关联,则可以使用proc。例如validates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
ЕвгенийМасленков

16

如果它不是验证过程的一部分,则可以使用#between?

2.between?(1, 4)
=> true

6

有关提交表单的准确错误消息,请尝试以下方法

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 100, message: 'must be between 0 & 100'

3

滑轨4

如果您想通过ActiveModel :: Validations来使用它,则可以使用

validates_inclusion_of :number, :in => start_number..end_number

或Rails 3语法

validates :number, :inclusion => start_number..end_number

但是我找到的最简单的方法是

number.between? start_number, end_number


也许包括一些解释。
GMchris,2016年

2

在Ruby 1.9中,最直接的翻译似乎是Range#cover?

如果obj在beg和end之间,则返回true,即beg <= obj <= end(或当exclude_end?为true时,结束不包含)。

如果您想知道与的区别是Range#include?什么,如果它是非数字范围,则后者会在范围​​的所有元素上进行迭代。有关更多详细说明,请参见此博客文章


1

如果要检查自定义数组中是否存在特定编号,

例如,我想知道list = [1,4,6,10]中是否包含5

list.include? 5 => false
list.include? 6 => true
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.