Vérifier si une variable est un entier

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

Par exemple,

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

Vous pouvez utiliser le is_a? méthode

 >> 1.is_a? Integer => true >> "dadadad@asdasd.net".is_a? Integer => false >> 

Si vous voulez savoir si un object est un Integer ou quelque chose qui peut être converti de manière significative en Integer ( to_i pas des choses comme "hello" , que to_i convertira en 0 ):

 result = Integer(obj) rescue false 

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 

Si vous n’êtes pas certain du type de la variable (il peut s’agir d’une chaîne de caractères numériques), dites qu’il s’agit d’un numéro de carte de crédit passé dans les parameters. Je n’ai 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 souligne un oubli de cette méthode, gardez ceci à l’esprit:

 is_number? "01" # false. oops! 

Il y a var.is_a? Class var.is_a? Class (dans votre cas: var.is_a? Integer ); cela pourrait correspondre à la facture. Ou il y a Integer(var) , où il lancera une exception s’il ne peut pas l’parsingr.

Un moyen plus “dactylographier” consiste à utiliser respond_to? de cette façon, les classes “de type entier” ou “de type chaîne” peuvent également être utilisées

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

Vous pouvez utiliser sortingple égal.

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

Si vous n’avez pas besoin de convertir des valeurs nulles, je trouve que les méthodes to_i et to_f sont extrêmement utiles car elles convertissent la chaîne en une valeur nulle (si non convertible ou nulle) ou en une valeur 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 

Et comme vous le faites maintenant, la valeur 0 est falsey donc il peut être utilisé dans les conditions

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

Je trouve ce comportement très utile car il utilisera toute la logique de conversion de Ruby et souvent, dans ma logique, la casse 0 est utilisée comme falsey

MODIFIER

Ah vient de découvrir les cas sombres … semble se produire que si le numéro est en première position si

 "12blah".to_i => 12 

Capitaliser sur la réponse d’Alex D , en utilisant des raffinements :

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

Plus tard, dans ta classe:

 require 'core_ext/ssortingng/integerable' class MyClass using CoreExtensions::Integerable def method 'my_ssortingng'.integer? end end 

J’ai eu un problème similaire avant d’essayer de déterminer si quelque chose est une chaîne ou un numéro 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 si elle est 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

Vous cherchez probablement quelque chose comme ceci:

Accepter “2.0 ou 2.0 comme INT mais rejeter 2.1 et” 2.1 ”

num = 2.0

si num.is_a? Ssortingng num = Flotteur (num) sauvetage fin de fin

new_num = Integer (num) rescue false

met num

met new_num

met num == new_num