Проверка, является ли переменная целым числом - PullRequest
128 голосов
/ 04 января 2011

Есть ли в Rails 3 или Ruby встроенный способ проверки, является ли переменная целым числом?

Например,

1.is_an_int #=> true
"dadadad@asdasd.net".is_an_int #=> false?

Ответы [ 11 ]

253 голосов
/ 04 января 2011

Вы можете использовать is_a? метод

>> 1.is_a? Integer
=> true
>> "dadadad@asdasd.net".is_a? Integer
=> false
>>
48 голосов
/ 08 августа 2013

Если вы хотите знать, является ли объект Integer или чем-то, что может быть существенно преобразовано в целое число (НЕ включая такие вещи, как "hello", который to_i преобразует в 0):

result = Integer(obj) rescue false
29 голосов
/ 04 января 2011

Используйте регулярное выражение в строке:

def is_numeric?(obj) 
   obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
end

Если вы хотите проверить, является ли переменная определенного типа, вы можете просто использовать kind_of?:

1.kind_of? Integer #true
(1.5).kind_of? Float #true
is_numeric? "545"  #true
is_numeric? "2aa"  #false
15 голосов
/ 08 августа 2013

Если вы не уверены в типе переменной (это может быть строка числовых символов), скажем, это был номер кредитной карты, переданный в параметры, поэтому изначально это будет строка, но вы хотите убедиться, чтов нем нет буквенных символов, я бы использовал этот метод:

    def is_number?(obj)
        obj.to_s == obj.to_i.to_s
    end

    is_number? "123fh" # false
    is_number? "12345" # true

@ Бенни указывает на недосмотр этого метода, имейте это в виду:

is_number? "01" # false. oops!
5 голосов
/ 04 января 2011

Там var.is_a? Class (в вашем случае: var.is_a? Integer); это может отвечать всем требованиям. Или есть Integer(var), где он выдаст исключение, если не сможет его проанализировать.

4 голосов
/ 03 мая 2016

Вы можете использовать тройной равный.

if Integer === 21 
    puts "21 is Integer"
end
3 голосов
/ 26 апреля 2012

Более "утконтный" способ заключается в использовании respond_to?, таким образом, "целочисленные" или "строковые" классы также могут использоваться

if(s.respond_to?(:match) && s.match(".com")){
  puts "It's a .com"
else
  puts "It's not"
end
2 голосов
/ 25 февраля 2017

В случае, если вам не нужно преобразовывать нулевые значения, я считаю методы to_i и to_f чрезвычайно полезными, поскольку они преобразуют строку либо в нулевое значение (если оно не преобразуется, либо в ноль), либо вфактическое значение Integer или Float.

"0014.56".to_i # => 14
"0014.56".to_f # => 14.56
"0.0".to_f # => 0.0
"not_an_int".to_f # 0
"not_a_float".to_f # 0.0

"0014.56".to_f ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => I'm a float
"not a float" ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => "I'm not a float or the 0.0 float"

EDIT2: будьте осторожны, целочисленное значение 0 не является ложным, оно соответствует действительности (!!0 #=> true) (спасибо @prettycoder)

РЕДАКТИРОВАТЬ

А, только что узнал о темных случаях ... кажется, происходит, только если номер находится в первой позиции, хотя

"12blah".to_i => 12
1 голос
/ 10 июня 2016

Чтобы воспользоваться ответом Алекса D , используйте уточнения :

module CoreExtensions
  module Integerable
    refine String do
      def integer?
        Integer(self)
      rescue ArgumentError
        false
      else
        true
      end
    end
  end
end

Позже, в вашем классе:

require 'core_ext/string/integerable'

class MyClass
  using CoreExtensions::Integerable

  def method
    'my_string'.integer?
  end
end
0 голосов
/ 27 февраля 2018

Возможно, вы ищете что-то вроде этого:

Примите "2.0 или 2.0 как INT, но отклоните 2.1 и" 2.1 "

num =2.0

if num.is_a? String num = Float (num) спасение false false end

new_num = Integer (num) спасение false

ставит num

ставит new_num

ставит num == new_num

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...