¿Rails 3 o Ruby tienen una forma integrada de verificar si una variable es un entero?
Por ejemplo,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
ruby
ruby-on-rails-3
Un aprendiz
fuente
fuente
to_i
. Eso es parte del "tipeo de pato" de Ruby: si puede actuar como un número entero, trátelo como tal.kind_of?
es un alias parais_a?
.is_a?
es ligeramente diferente; pregunta si el objeto de una instancia de una clase específica;kind_of?
pregunta si es una instancia o hijo de una clase específica.fido.is_a? Dog
es verdad;fido.kind_of? Animal
Es cierto, por ejemplo.Respuestas:
Puedes usar el
is_a?
métodofuente
Integer(obj) rescue false
Esto no funcionará para "1" si desea verificar si se convertiráSi desea saber si un objeto es un objeto
Integer
o algo que se puede convertir de manera significativa en un entero (sin incluir cosas como"hello"
, queto_i
se convertirá a0
):fuente
Integer(2.5) => 2
siempre es una conversión significativa.Use una expresión regular en una cadena:
Si desea verificar si una variable es de cierto tipo, simplemente puede usar
kind_of?
:fuente
\d+?
el?
especifica una coincidencia no codiciosa, mientras que probablemente quieras una coincidencia opcional. Cambiar\d+?
a\d*
podría solucionarlo, pero me gustaría ejecutarlo a través de un conjunto de pruebas para estar seguro. Esto tampoco coincidirá con la notación hexadecimal o exponencial, pero estoy seguro de que está bien para ciertos casos de uso.\A\d+\z
:?Integer(obj) rescue false
código de @ alex-d a continuación; regexp es difícil de leer y no está claro en su intención. Ambos funcionan, llegué a esta pregunta en un intento de arreglar una expresión regular mal construida que no siempre funcionaba :-)Si no está seguro del tipo de la variable (podría ser una cadena de caracteres numéricos), digamos que era un número de tarjeta de crédito que se pasó a los parámetros, por lo que originalmente sería una cadena pero desea asegurarse de que no No tiene ninguna letra, yo usaría este método:
@Benny señala un descuido de este método, tenga esto en cuenta:
fuente
obj.to_s == obj.to_f.to_s
igual que en mi caso.Puedes usar triple igual.
fuente
Hay
var.is_a? Class
(en su caso:)var.is_a? Integer
; eso podría encajar en la factura. O hayInteger(var)
, donde arrojará una excepción si no puede analizarlo.fuente
Una forma más de "escribir pato" es usar de
respond_to?
esta manera las clases "tipo entero" o "tipo cadena".fuente
En caso de que no es necesario convertir los valores cero, encuentro los métodos
to_i
yto_f
ser de gran utilidad ya que serán convertir la cadena ya sea a un valor cero (si no convertible o cero) o el realInteger
oFloat
valor.EDIT2: tenga cuidado, el
0
valor entero no es falso, es verdadero (!!0 #=> true
) (gracias @prettycoder)EDITAR
Ah, acabo de enterarme de los casos oscuros ... aunque parece que solo sucede si el número está en primera posición
fuente
Para capitalizar la respuesta de Alex D , usando refinamientos :
Más tarde, en tu clase:
fuente
He tenido un problema similar antes de intentar determinar si algo es una cadena o cualquier tipo de número. He intentado usar una expresión regular, pero eso no es confiable para mi caso de uso. En su lugar, puede verificar la clase de la variable para ver si es un descendiente de la clase Numérica.
En esta situación, también puede sustituir cualquiera de los descendientes numéricos: BigDecimal, Date :: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex
fuente
Probablemente estés buscando algo como esto:
Acepte "2.0 o 2.0 como INT pero rechace 2.1 y" 2.1 "
fuente