Подтвердить что ты не робот

Проверка, является ли переменная целой

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

Например,

1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
4b9b3361

Ответ 1

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

>> 1.is_a? Integer
=> true
>> "[email protected]".is_a? Integer
=> false
>>

Ответ 2

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

result = Integer(obj) rescue false

Ответ 3

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

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

Ответ 4

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

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

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

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

is_number? "01" # false. oops!

Ответ 5

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

Ответ 6

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

if(s.respond_to?(:match) && s.match(".com")){
  puts "It a .com"
else
  puts "It not"
end

Ответ 7

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

if Integer === 21 
    puts "21 is Integer"
end

Ответ 8

Если вам не нужно преобразовывать нулевые значения, я считаю методы 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"

РЕДАКТИРОВАТЬ 2: будьте осторожны, целочисленное значение 0 не является ложным, это правда (!!0 #=> true) (спасибо @prettycoder)

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

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

"12blah".to_i => 12

Ответ 9

Чтобы использовать ответ Alex D, используя refinements

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

Ответ 10

У меня была аналогичная проблема, прежде чем пытаться определить, есть ли что-то строка или какой-либо номер. Я попытался использовать регулярное выражение, но это не является надежным для моего варианта использования. Вместо этого вы можете проверить класс переменной, чтобы узнать, является ли он потомком класса Numeric.

if column.class < Numeric
  number_to_currency(column)
else
  column.html_safe
end

В этой ситуации вы также можете заменить любого из числовых потомков: BigDecimal, Date:: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex

Ответ 11

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

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

число = 2,0

если num.is_a? String num = Float (num) спасение ложного конца

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

ставит num

ставит new_num

ставит num == new_num