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



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



например,



1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
623   11  

11 ответов:

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

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

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

result = Integer(obj) rescue false

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

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

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

    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!

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

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

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

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

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

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

и как вы сейчас, 0 значение falsey поэтому его можно использовать в условных выражениях

"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"

Я нахожу это поведение весьма полезным, так как он будет использовать всю логику преобразования Ruby и часто в моей логике 0 случай используется как фальсификация в любом случае

EDIT

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

"12blah".to_i => 12

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

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

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

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

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

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

принять "2.0 или 2.0 как INT, но отклонить 2.1 и "2.1"

num = 2.0

Если num. is_a? String num = Float (num) rescue false end

new_num = Integer (num) rescue false

ставит num

ставит new_num

ставит num = = new_num

Comments

    Ничего не найдено.