O Rails 3 ou Ruby tem uma maneira integrada de verificar se uma variável é um número inteiro?
Por exemplo,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
ruby
ruby-on-rails-3
Um aprendiz
fonte
fonte
to_i
. Isso faz parte da "digitação de pato" de Ruby: se ele pode agir como um número inteiro, trate-o como um.kind_of?
é um apelido parais_a?
.is_a?
é um pouco diferente; pergunta se o objeto de uma instância de uma classe específica;kind_of?
pergunta se é uma instância ou filho de uma classe específica.fido.is_a? Dog
é verdade;fido.kind_of? Animal
é verdade, por exemplo.Respostas:
Você pode usar o
is_a?
métodofonte
Integer(obj) rescue false
Isso não funcionará para "1" se você quiser verificar se ele converteráSe você deseja saber se um objeto é um objeto
Integer
ou algo que pode ser convertido significativamente em um número inteiro (NÃO incluindo coisas como"hello"
, queto_i
será convertido em0
):fonte
Integer(2.5) => 2
é sempre uma conversão significativa.Use uma expressão regular em uma string:
Se você deseja verificar se uma variável é de determinado tipo, você pode simplesmente usar
kind_of?
:fonte
\d+?
nos?
especifica um jogo não-gananciosos, enquanto você provavelmente quer uma correspondência opcional. Alterar\d+?
para\d*
pode corrigi-lo, mas eu gostaria de executá-lo através de um conjunto de testes para ter certeza. Isso também não corresponde à notação hexadecimal ou exponencial, mas tenho certeza de que isso é bom para certos casos de uso.\A\d+\z
:?Integer(obj) rescue false
código de @ alex-d abaixo; O regexp é difícil de ler e não é claro em sua intenção. Ambos trabalham, eu vim a esta pergunta em uma tentativa de corrigir um regexp mal construídos que nem sempre estava trabalhando :-)Se você não tiver certeza do tipo da variável (pode ser uma sequência de caracteres numéricos), diga que era um número de cartão de crédito passado para os parâmetros, portanto, originalmente seria uma sequência, mas você deseja garantir que não Se houver caracteres de letra, eu usaria este método:
@Benny destaca uma supervisão desse método, lembre-se disso:
fonte
obj.to_s == obj.to_f.to_s
exatamente como no meu caso.Você pode usar o triplo igual.
fonte
Existe
var.is_a? Class
(no seu casovar.is_a? Integer
:); isso pode se encaixar na conta. Ou háInteger(var)
, onde ele lançará uma exceção se não puder analisá-la.fonte
Uma maneira mais "tipográfica de digitação" é usar
respond_to?
dessa maneira as classes "tipo inteiro" ou "tipo string" também podem ser usadasfonte
No caso de você não precisa converter os valores zero, eu encontrar os métodos
to_i
eto_f
ser extremamente útil, uma vez que irá converter a string para qualquer um valor zero (se não conversíveis ou zero) ou o realInteger
ouFloat
valor.EDIT2: cuidado, o
0
valor inteiro não é falsey; é verdade (!!0 #=> true
) (obrigado @prettycoder)EDITAR
Ah, descobri os casos escuros ... parece que só acontece se o número estiver na primeira posição
fonte
Para capitalizar a resposta de Alex D , usando refinamentos :
Mais tarde, na sua classe:
fonte
Eu tive um problema semelhante antes de tentar determinar se algo é uma string ou qualquer tipo de número. Eu tentei usar uma expressão regular, mas isso não é confiável para o meu caso de uso. Em vez disso, você pode verificar a classe da variável para ver se é uma descendente da classe Numérica.
Nessa situação, você também pode substituir qualquer um dos descendentes numéricos: BigDecimal, Date :: Infinity, Inteiro, Fixnum, Float, Bignum, Rational, Complex
fonte
Provavelmente você está procurando algo parecido com isto:
Aceite "2.0 ou 2.0 como INT, mas rejeite 2.1 e" 2.1 "
fonte