Como verifico se uma variável é um número inteiro em JavaScript e emito um alerta se não for? Eu tentei isso, mas não funciona:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
javascript
JBa
fonte
fonte
parseInt
.Number.isInteger
seguir a maneira menos invasiva.Respostas:
Use o operador === ( igualdade estrita ) como abaixo,
fonte
2.0 === 2
desde o decimal desnecessária é apenas uma representação diferente do mesmo número, portanto,parseInt(2.0) === 2.0
é equivalente aoparseInt(2) === 2
que é verdadeIsso depende, você também deseja converter cadeias de caracteres como números inteiros em potencial?
Isso fará:
Com operações Bitwise
Análise e verificação simples
Curto-circuito e salvando uma operação de análise:
Ou talvez ambos de uma só vez:
Testes:
Aqui está o violino: http://jsfiddle.net/opfyrqwp/28/
atuação
Os testes revelam que a solução de curto-circuito tem o melhor desempenho (ops / s).
Aqui está uma referência: http://jsben.ch/#/htLVw
Se você gosta de uma forma mais curta e obtusa de curto-circuito:
Claro, eu sugiro deixar o minifier cuidar disso.
fonte
Supondo que você não saiba nada sobre a variável em questão, siga esta abordagem:
Simplificando:
fonte
"1.0"
é uma sequência e, portanto, não é um número. Caso contrário1
, será o valor de uma variável se você a definir assimvar my_var=1.0;
, que é corretamente identificado por esta função como um número inteiro.Number.isInteger()
vai funcionar ... até então, esta é uma boa maneira de fazê-loNumber.isInteger()
parece ser o caminho a percorrer.A MDN também forneceu o seguinte polyfill para navegadores que não suportam
Number.isInteger()
, principalmente todas as versões do IE.Link para a página MDN
fonte
Você pode verificar se o número tem um restante:
Lembre-se, se sua entrada também pode ser texto e você deseja verificar primeiro, não é, então pode verificar o tipo primeiro:
fonte
0 % 1 === 0
no console. Retornatrue
como0 % 1
retornos0
.0 % 1
retorna0
no modo de compatibilidade IE9, IE8 e IE7.Você pode usar uma expressão regular simples:
fonte
Primeiro, NaN é um "número" (sim, eu sei que é estranho, apenas role com ele), e não uma "função".
Você precisa verificar se o tipo da variável é um número e, para verificar o número inteiro, eu usaria o módulo.
fonte
(0 == 0 || 0 % 1 == 0)
irá avaliar atrue
.0 % 1 == 0
também avalia atrue
!%
não é divisão!Tenha cuidado ao usar
string vazia ('') ou booleana (true ou false) retornará como número inteiro. Você pode não querer fazer isso
Number.isInteger (dados)
função incorporada no navegador. Dosnt suporta navegadores antigos
Alternativas:
No entanto, Math.round () também falhará para string vazia e booleana
fonte
Para verificar se um número inteiro como o pôster deseja:
observe + na frente dos dados (converte a string em número) e === para obter a exata.
Aqui estão alguns exemplos:
fonte
return (+data===parseInt(data))
?fonte
A solução pré-ECMAScript-6 mais simples e limpa (que também é suficientemente robusta para retornar false, mesmo que um valor não numérico, como uma string ou nulo, seja passado para a função) seria o seguinte:
A solução a seguir também funcionaria, embora não seja tão elegante quanto a acima:
Observe que Math.ceil () ou Math.floor () pode ser usado igualmente bem (em vez de Math.round ()) na implementação acima.
Ou alternativamente:
Uma solução incorreta bastante comum é a seguinte:
Embora essa abordagem baseada em parseInt funcione bem para muitos valores de x, uma vez que x se torne bastante grande, ele não funcionará corretamente. O problema é que parseInt () restringe seu primeiro parâmetro a uma string antes de analisar dígitos. Portanto, uma vez que o número se torne suficientemente grande, sua representação em cadeia será apresentada na forma exponencial (por exemplo, 1e + 21). Consequentemente, parseInt () tentará analisar 1e + 21, mas interromperá a análise quando atingir o caractere e, portanto, retornará um valor de 1. Observe:
fonte
Por que ninguém mencionou
Number.isInteger()
?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Funciona perfeitamente para mim e resolve o problema com o
NaN
número inicial.fonte
Number.isInteger()
, 3,5 anos antes: stackoverflow.com/a/27424770/5208540No ES6, 2 novos métodos são adicionados ao Number Object.
Nele, o método Number.isInteger () retorna true se o argumento for um número inteiro.
Exemplo de uso:
fonte
O padrão ECMA-262 6.0 (ES6) inclui a função Number.isInteger .
Para adicionar suporte ao navegador antigo, recomendo o uso de uma solução forte e suportada pela comunidade em:
https://github.com/paulmillr/es6-shim
que é uma biblioteca pura de polyfills ES6 JS .
Note que esta lib requer es5-shim, basta seguir README.md.
fonte
Você pode tentar
Number.isInteger(Number(value))
sevalue
pode ser um número inteiro na forma de sequência, por exemplo,var value = "23"
e deseja que isso avalietrue
. Evite tentar,Number.isInteger(parseInt(value))
porque isso nem sempre retorna o valor correto. por exemplo, sevar value = "23abc"
você usar aparseInt
implementação, ela ainda retornará verdadeira.Mas se você deseja valores estritamente inteiros, provavelmente
Number.isInteger(value)
deve fazer o truque.fonte
fonte
Verifique se a variável é igual à mesma variável arredondada para um número inteiro, assim:
fonte
true
paraNaN
, simplesmente mudando!=
para!==
e invertendo osif
blocos. Isso funciona porqueNaN
é o único valor em JavaScript que não se iguala. Por exemplo, o novo código deve serif (Math.round(x) === x) { /* x IS an integer! */ }
Além disso
Number.isInteger()
,. TalvezNumber.isSafeInteger()
seja outra opção aqui , usando o especificado no ES6.Para polyfill
Number.isSafeInteger(..)
em navegadores anteriores ao ES6:fonte
Number.isInteger()
é a melhor maneira, se o seu navegador suportar, se não, acho que existem muitas maneiras de seguir:ou:
ou:
ou:
agora podemos testar os resultados:
Portanto, todos esses métodos são funcionais, mas quando o número é muito grande, o parseInt e o operador ^ não funcionam bem.
fonte
Apenas tente o seguinte:
fonte
Você poderia usar esta função:
Ele retornará true, mesmo que o valor seja uma sequência que contenha um valor inteiro.
Portanto, os resultados serão:
fonte
Minha abordagem:
a >= 1e+21
O teste só pode passar por um valor que precisa ser um número e um valor muito grande. Isso abrangerá todos os casos, com certeza, ao contrário de outras soluções fornecidas nesta discussão.a === (a|0)
Se o argumento da função fornecida for exatamente (===) o mesmo que o valor transformado em bits, significa que o argumento é um número inteiro.a|0
retornará0
para qualquer valor dea
que não é um número , e sea
é de fato um número, ele irá retirar afastado qualquer coisa depois do ponto decimal, por isso1.0001
vai se tornar1
fonte
Você pode usar o regexp para isso:
fonte
Em http://www.toptal.com/javascript/interview-questions :
Achei que era a melhor maneira de fazer isso.
fonte
Use o
|
operador:Portanto, uma função de teste pode ser assim:
fonte
Isso resolverá mais um cenário ( 121. ), um ponto no final
fonte
Para valores inteiros positivos sem separadores:
Testes 1. se não estiverem vazios e 2. se o valor for igual ao resultado da substituição de um caractere não dígito em seu valor.
fonte
Ok, tenho menos, porque não descreveu meu exemplo, então mais exemplos :):
Eu uso expressão regular e método de teste:
fonte
você também pode tentar dessa maneira
ou
fonte
data=22.5;
. Também os dois ramos têmconsole.log("not an integer")
:: SEu tive que verificar se uma variável (string ou número) é um número inteiro e usei esta condição:
http://jsfiddle.net/e267369d/1/
Algumas das outras respostas têm uma solução semelhante (confie na
parseFloat
combinação comisNaN
), mas a minha deve ser mais direta e autoexplicativa.Edit: eu descobri que meu método falha para strings contendo vírgula (como "1,2") e também percebi que, no meu caso particular, quero que a função falhe se uma string não for um número inteiro válido (deve falhar em qualquer flutuação , mesmo 1.0). Então aqui está minha função Mk II:
http://jsfiddle.net/e267369d/3/
Obviamente, caso você realmente precise da função para aceitar números inteiros flutuantes (itens 1.0), você sempre poderá remover a condição de ponto
a.indexOf('.') == -1
.fonte