Rails 3 ou Ruby ont-ils 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?
ruby
ruby-on-rails-3
Un apprenti
la source
la source
to_i
. Cela fait partie du "typage canard" de Ruby: s'il peut agir comme un entier, traitez-le comme tel.kind_of?
est un alias deis_a?
.is_a?
est légèrement différent; il demande si l'objet d'une instance d'une classe spécifique;kind_of?
demande s'il s'agit d'une instance ou d'un enfant d'une classe spécifique.fido.is_a? Dog
est vrai;fido.kind_of? Animal
est vrai, par exemple.Réponses:
Vous pouvez utiliser la
is_a?
méthodela source
Integer(obj) rescue false
Cela ne fonctionnera pas pour "1" si vous voulez vérifier si cela convertiraSi vous voulez savoir si un objet est un
Integer
ou quelque chose qui peut être converti de manière significative en un entier (sans inclure des choses comme"hello"
, quito_i
sera converti en0
):la source
Integer(2.5) => 2
c'est toujours une conversion significative.Utilisez une expression régulière sur une chaîne:
Si vous voulez vérifier si une variable est d'un certain type, vous pouvez simplement utiliser
kind_of?
:la source
\d+?
le?
spécifie une correspondance non gourmande, alors que vous voulez probablement une correspondance facultative. Changer\d+?
en\d*
peut le résoudre, mais je voudrais le faire passer par une suite de tests pour être sûr. Cela ne correspond pas non plus à la notation hexadécimale ou exponentielle, mais je suis sûr que cela convient à certains cas d'utilisation.\A\d+\z
?Integer(obj) rescue false
code de @ alex-d ci-dessous; regexp est difficile à lire et son intention n'est pas claire. Les deux fonctionnent, je suis venu à cette question dans le but de réparer une expression rationnelle mal construite qui ne fonctionnait pas toujours :-)Si vous n'êtes pas sûr du type de la variable (il pourrait s'agir d'une chaîne de caractères numériques), disons que c'était un numéro de carte de crédit passé dans les paramètres, donc ce serait à l'origine une chaîne, mais vous voulez vous assurer que ce n'est pas le cas. t avoir des caractères de lettre dedans, j'utiliserais cette méthode:
@Benny souligne un oubli de cette méthode, gardez ceci à l'esprit:
la source
obj.to_s == obj.to_f.to_s
comme dans mon cas.Vous pouvez utiliser le triple égal.
la source
Il y a
var.is_a? Class
(dans votre cas:)var.is_a? Integer
; cela pourrait convenir à la facture. Ou il y aInteger(var)
, où il lancera une exception s'il ne peut pas l'analyser.la source
Une manière plus "de typage canard" est d'utiliser de
respond_to?
cette manière les classes "de type entier" ou "de type chaîne" peuvent également être utiliséesla source
Si vous ne avez pas besoin de convertir les valeurs zéro, je trouve les méthodes
to_i
etto_f
d'être extrêmement utiles car ils convertir la chaîne en soit une valeur nulle (sinon convertible ou nul) ou réelleInteger
ouFloat
valeur.EDIT2: attention, la
0
valeur entière n'est pas fausse, c'est la vérité (!!0 #=> true
) (merci @prettycoder)ÉDITER
Ah je viens de découvrir les cas sombres ... semble ne se produire que si le numéro est en première position
la source
Pour capitaliser sur la réponse d'Alex D , en utilisant des raffinements :
Plus tard, dans votre classe:
la source
J'ai eu un problème similaire avant d'essayer de déterminer si quelque chose est une chaîne ou une sorte de nombre. 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.
Dans cette situation, vous pouvez également remplacer l'un des descendants numériques: BigDecimal, Date :: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex
la source
Vous recherchez probablement quelque chose comme ceci:
Acceptez "2.0 ou 2.0 comme INT mais rejetez 2.1 et" 2.1 "
la source