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?
Vous pouvez utiliser la méthode is_a?
>> 1.is_a? Integer
=> true
>> "[email protected]".is_a? Integer
=> false
>>
Si vous voulez savoir si un objet est un Integer
ou 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
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 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!
Vous pouvez utiliser le triple égal.
if Integer === 21
puts "21 is Integer"
end
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.
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
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
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
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