94

I am using Ruby on Rails 3.0.9 and I would like to check if a number is included in a range. That is, if I have a variable number = 5 I would like to check 1 <= number <= 10 and retrieve a boolean value if the number value is included in that range.

I can do that like this:

number >= 1 && number <= 10

but I would like to do that in one statement. How can I do that?

Backo
  • 18,291
  • 27
  • 103
  • 170

7 Answers7

179

(1..10).include?(number) is the trick.

Btw: If you want to validate a number using ActiveModel::Validations, you can even do:

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

read here about validates_inclusion_of

or the Rails 3+ way:

validates :number, :inclusion => 1..10
BananaNeil
  • 10,322
  • 7
  • 46
  • 66
Mario Uher
  • 12,249
  • 4
  • 42
  • 68
77

Enumerable#include?:

(1..10).include? n

Range#cover?:

(1..10).cover? n

Comparable#between?:

n.between? 1, 10

Numericality Validator:

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

Inclusion Validator:

validates :n, inclusion: 1..10
tybro0103
  • 48,327
  • 33
  • 144
  • 170
16

If it's not part of a validation process you can use #between? :

2.between?(1, 4)
=> true
Holin
  • 1,191
  • 10
  • 10
9

For accurate error messages on a form submit , try these

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 100, message: 'must be between 0 & 100'
jeffdill2
  • 3,968
  • 2
  • 30
  • 47
Jon
  • 555
  • 5
  • 5
4

Rails 4

if you want it through ActiveModel::Validations you can use

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

or the Rails 3 syntax

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

But The simplest way i find is

number.between? start_number, end_number

Sudhir Vishwakarma
  • 785
  • 10
  • 15
2

In Ruby 1.9 the most direct translation seems to be Range#cover?:

Returns true if obj is between beg and end, i.e beg <= obj <= end (or end exclusive when exclude_end? is true).

In case you wonder how that's different from Range#include?, it's that the latter iterates over all elements of the range if it's a non-numeric range. See this blog post for a more detailed explanation.

Michael Kohl
  • 66,324
  • 14
  • 138
  • 158
1

If you want to check particular number exists in custom array,

As for example I want to know whether 5 is included in list=[1,4,6,10] or not

list.include? 5 => false
list.include? 6 => true
Lakhani Aliraza
  • 435
  • 6
  • 8