web-dev-qa-db-fra.com

Vérifier si une variable est un entier

Est-ce que Rails 3 ou Ruby dispose d'un moyen intégré de vérifier si une variable est un entier?

Par exemple,

1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
129
AnApprentice

Vous pouvez utiliser la méthode is_a?

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

Si vous voulez savoir si un objet est un Integerou quelque chose qui peut être converti de manière significative en un entier (NON inclus des choses comme "hello", qui to_i va convertir en 0):

result = Integer(obj) rescue false
48
Alex D

Utilisez une expression régulière sur une chaîne:

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

Si vous voulez vérifier si une variable est d'un certain type, vous pouvez simplement utiliser kind_of?:

1.kind_of? Integer #true
(1.5).kind_of? Float #true
is_numeric? "545"  #true
is_numeric? "2aa"  #false
29
Jacob Relkin

Si vous ne connaissez pas le type de la variable (il peut s'agir d'une chaîne de chiffres), supposez que le numéro de carte de crédit a été transféré dans les paramètres. Il s'agirait donc d'une chaîne, mais vous voulez vous assurer qu'elle ne le sera pas. n’ayant aucune lettre, j’utiliserais cette méthode:

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

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

@Benny signale un oubli de cette méthode, gardez cela à l'esprit:

is_number? "01" # false. oops!
15
Sarah

Vous pouvez utiliser le triple égal.

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

Il y a var.is_a? Class (dans votre cas: var.is_a? Integer); cela pourrait faire l'affaire. Ou bien il y a Integer(var), où il lève une exception s'il ne peut pas l'analyser.

5
Groxx

Une méthode plus courante consiste à utiliser respond_to? ainsi, vous pouvez également utiliser des classes "de type entier" ou "de type chaîne".

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

Au cas où vous n’auriez pas besoin de convertir des valeurs nulles, je trouve les méthodes to_i et to_f extrêmement utiles car elles convertissent la chaîne en valeur zéro (si non convertible ou nulle) ou la valeur réelle Integer ou 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: soyez prudent, le 0 valeur entière n'est pas falsey, c'est la vérité (!!0 #=> true) (merci @prettycoder)

MODIFIER

Ah viens de découvrir les cas sombres ... semble se produire que si le nombre est en première position si

"12blah".to_i => 12
2
Cyril Duchon-Doris

Pour capitaliser sur la réponse de Alex D , en utilisant raffinements :

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

Plus tard, dans votre classe:

require 'core_ext/string/integerable'

class MyClass
  using CoreExtensions::Integerable

  def method
    'my_string'.integer?
  end
end
1
Vadym Tyemirov

J'ai eu un problème similaire avant d'essayer de déterminer si quelque chose est une chaîne ou un chiffre quelconque. J'ai essayé d'utiliser une expression régulière, mais ce n'est pas fiable pour mon cas d'utilisation. Au lieu de cela, vous pouvez vérifier la classe de la variable pour voir s'il s'agit d'un descendant de la classe Numeric.

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

Dans cette situation, vous pouvez également remplacer l'un des descendants numériques: BigDecimal, Date :: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex

0
penguincoder