Espero que exista algo no mesmo espaço conceitual que a antiga IsNumeric()
função VB6 ?
javascript
validation
numeric
Electrons_Ahoy
fonte
fonte
isNaN("")
,isNaN(" ")
,isNaN(false)
, etc. ele retornafalse
para estes, o que implica que eles são números.Respostas:
Para verificar se uma variável (incluindo uma string) é um número, verifique se não é um número:
Isso funciona independentemente de o conteúdo da variável ser uma sequência ou número.
Exemplos
Obviamente, você pode negar isso se precisar. Por exemplo, para implementar o
IsNumeric
exemplo que você deu:Para converter uma string contendo um número em um número:
Só funciona se a string contiver apenas caracteres numéricos, caso contrário, ela retornará
NaN
.Exemplos
Para converter uma sequência frouxamente em um número
Útil para converter '12px' em 12, por exemplo:
Exemplos
Flutuadores
Tenha em mente que, ao contrário
+num
,parseInt
(como o nome sugere) irá converter um float em um número inteiro por decepar tudo após o ponto decimal (se você quiser usarparseInt()
por causa esse comportamento, você é provavelmente melhor fora de usar um outro método em vez ) :Cordas vazias
Strings vazias podem ser um pouco contra-intuitivas.
+num
converte cadeias vazias ou cadeias com espaços em zero eisNaN()
assume o mesmo:Mas
parseInt()
não concorda:fonte
isNaN
"Para verificar se uma variável não é um número". "não é um número" não é o mesmo que "IEEE-794 NaN", que é o queisNaN
testa. Em particular, esse uso falha ao testar booleanos e seqüências de caracteres vazias, pelo menos. Consulte developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .var n = 'a'; if (+n === +n) { // is number }
é ~ 3994% mais rápido que o isNaN na versão mais recente do Chrome. Veja o teste de desempenho aqui: jsperf.com/isnan-vs-typeof/5isNaN(1 + false + parseInt("1.do you trust your users?"))
E você pode seguir o caminho RegExp:
fonte
Se você está apenas tentando verificar se uma string é um número inteiro (sem casas decimais), a regex é um bom caminho a percorrer. Outros métodos, como
isNaN
são muito complicados para algo tão simples.Para permitir apenas números inteiros positivos , use o seguinte:
fonte
/^-?\d+$/
direita?Se você realmente quer ter certeza de que uma string contém apenas um número, qualquer número (inteiro ou ponto flutuante), e exatamente um número, você não pode usar
parseInt()
/parseFloat()
,Number()
ou!isNaN()
por si mesmos. Observe que,!isNaN()
na verdade, está retornandotrue
quandoNumber()
retornaria um número efalse
quando retornariaNaN
, portanto, vou excluí-lo do restante da discussão.O problema
parseFloat()
é que ele retornará um número se a sequência contiver algum número, mesmo que a sequência não contenha apenas e exatamente um número:O problema
Number()
é que ele retornará um número nos casos em que o valor passado não é um número!O problema de rolar o seu próprio regex é que, a menos que você crie o regex exato para corresponder a um número de ponto flutuante, já que o Javascript o reconhece, você perderá casos ou reconhecerá casos em que não deveria. E mesmo que você possa rolar sua própria regex, por quê? Existem maneiras mais simples de fazer isso.
No entanto, acontece que
Number()
(eisNaN()
) faz a coisa certa para todos os casos em queparseFloat()
retorna um número quando não deveria e vice-versa. Então, para descobrir se uma string é realmente exatamente e apenas um número, ligue para ambas as funções e ver se eles tanto return true:fonte
' 1'
,'2 '
E' 3 '
todos return true.isNumber
função não está lidando com interfaces de usuário. Além disso, uma boa entrada de número não permitirá espaços para começar.A resposta aceita para esta pergunta tem algumas falhas (conforme destacado por outros usuários). Essa é uma das maneiras mais fáceis e comprovadas de abordá-lo em javascript:
Abaixo estão alguns bons casos de teste:
fonte
Experimente a função isNan :
fonte
isNaN()
retornafalse
para QUALQUER string que contenha apenas caracteres de espaço em branco, incluindo coisas como '\ u00A0'.Pergunta antiga, mas há vários pontos ausentes nas respostas fornecidas.
Notação científica.
!isNaN('1e+30')
étrue
, no entanto, na maioria dos casos, quando as pessoas pedem números, elas não querem corresponder a coisas como essa1e+30
.Grandes números flutuantes podem se comportar de maneira estranha
Observe (usando o Node.js):
Por outro lado:
Portanto, se alguém espera
String(Number(s)) === s
, limite melhor suas seqüências para 15 dígitos no máximo (depois de omitir zeros à esquerda).Infinidade
Dado tudo isso, verificar se a sequência fornecida é um número que satisfaz todos os seguintes itens:
Number
e de volta paraString
não é uma tarefa tão fácil. Aqui está uma versão simples:
No entanto, mesmo este está longe de estar completo. Os zeros à esquerda não são manipulados aqui, mas estragam o teste de comprimento.
fonte
Eu testei e a solução de Michael é a melhor. Vote na resposta acima (pesquise nesta página "Se você realmente quer ter certeza de que tem uma string" para encontrá-la). Em essência, sua resposta é esta:
Ele funciona para todos os casos de teste que eu documentei aqui: https://jsfiddle.net/wggehvp9/5/
Muitas das outras soluções falham nesses casos extremos: '', null, "", true e []. Em teoria, você poderia usá-los, com o tratamento adequado de erros, por exemplo:
ou
com tratamento especial para / \ s /, null, "", true, false, [] (e outros?)
fonte
Você pode usar o resultado de Number ao passar um argumento para seu construtor.
Se o argumento (uma sequência) não puder ser convertido em um número, ele retornará NaN, para que você possa determinar se a sequência fornecida era um número válido ou não.
Notas: Observe ao passar uma string vazia ou
'\t\t'
e'\n\t'
como Number retornará 0; Passar true retornará 1 e retornos falsos 0.fonte
Number
construtor é exatamente o mesmo que+x
.Number()
lida com números flutuantes, comoNumber.parseFloat()
nãoNumber.parseInt()
Talvez haja uma ou duas pessoas que se deparem com essa pergunta que precisam de uma verificação muito mais rigorosa do que o habitual (como eu). Nesse caso, isso pode ser útil:
Cuidado! Isto irá rejeitar strings como
.1
,40.000
,080
,00.1
. É muito exigente - a string deve corresponder à " forma perfeita mínima " do número para que esse teste seja aprovado.Ele usa o construtor
String
eNumber
para converter a string em um número e vice-versa e, assim, verifica se a "forma mínima perfeita" do mecanismo JavaScript (a qual foi convertida com oNumber
construtor inicial ) corresponde à string original.fonte
(str === String(Math.round(Number(str))))
."Infinity"
,"-Infinity"
e"NaN"
passe neste teste. No entanto, isso pode ser corrigido usando umNumber.isFinite
teste adicional .str === ("" + +str)
. Ele basicamente verifica se a sequência é o resultado da sequência de um número JS. Sabendo disso, também podemos ver um problema: o teste passa,0.000001
mas falha0.0000001
, e é quando1e-7
passa. O mesmo para números muito grandes.parseInt (), mas saiba que essa função é um pouco diferente no sentido de que, por exemplo, retorna 100 para parseInt ("100px").
fonte
parseInt(09)
.paraseInt(09, 10)
, 10
argumento.parseInt('09')
agora é igual a 9.Citar:
não é totalmente verdade se você precisar verificar espaços à esquerda / à direita - por exemplo, quando uma certa quantidade de dígitos for necessária e você precisar obter, por exemplo, '1111' e não '111' ou '111' para talvez um PIN entrada.
Melhor usar:
fonte
'-1'
,'0.1'
e'1e10'
tudo falso retorno. Além disso, valores maiores que o infinito positivo ou menores que o infinito negativo retornam true, enquanto provavelmente devem retornar false.Por que a implementação do jQuery não é boa o suficiente?
Michael sugeriu algo assim (embora eu tenha roubado a versão alterada de "user1691651 - John" aqui):
A seguir, é apresentada uma solução com provavelmente um desempenho ruim, mas com resultados sólidos. É uma engenhoca feita a partir da implementação do jQuery 1.12.4 e da resposta de Michael, com uma verificação extra para espaços iniciais / finais (porque a versão de Michael retorna verdadeira para números com espaços iniciais / finais):
A última versão possui duas novas variáveis, no entanto. Pode-se contornar um desses, fazendo:
Não testei muito disso, por outros meios, além de testar manualmente os poucos casos de uso que farei com minha situação atual, que é uma coisa muito comum. Esta é uma situação "em pé sobre os ombros dos gigantes".
fonte
Não é válido para o TypeScript como:
declare function isNaN(number: number): boolean;
Para TypeScript, você pode usar:
/^\d+$/.test(key)
fonte
Bem, eu estou usando este que eu fiz ...
Está trabalhando até agora:
Se você encontrar algum problema, diga-me, por favor.
fonte
return !isNaN(parseInt(value, 10));
Se alguém chega a esse ponto, passei algum tempo tentando descobrir o moment.js ( https://github.com/moment/moment ). Aqui está uma coisa que eu tirei dela:
Lida com os seguintes casos:
Verdade! :
Falso! :
Ironicamente, aquele com quem mais estou lutando:
Todas as sugestões são bem-vindas. :]
fonte
isNumeric(' ')
eisNumeric('')
?&& (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number
para abordar a questão acima mencionada e uma que eu mesmo.Usando JavaScript simples:
Usando o Lodash:
fonte
fonte
2019: Incluindo exemplos ES3, ES6 e TypeScript
Talvez isso tenha sido repetido muitas vezes, no entanto, eu lutei com essa também hoje e queria postar minha resposta, pois não vi nenhuma outra resposta que a faça de maneira simples ou completa:
ES3
ES6
Texto datilografado
Isso parece bastante simples e abrange todas as bases que eu vi nas muitas outras postagens e pensei:
Você também pode tentar sua própria
isNumeric
função e simplesmente passar nesses casos de uso e procurar "true" em todos eles.Ou, para ver os valores que cada retorno:
fonte
2019: Verificação prática e rigorosa da validade numérica
Freqüentemente, um 'número válido' significa um número Javascript excluindo NaN e Infinity, ou seja, um 'número finito'.
Para verificar a validade numérica de um valor (de uma fonte externa, por exemplo), você pode definir no estilo ESlint Airbnb:
e use desta maneira:
fonte
PFB a solução de trabalho:
fonte
Salve-se a dor de cabeça ao tentar encontrar uma solução "embutida".
Não há uma boa resposta, e a resposta altamente votada neste tópico está errada.
npm install is-number
fonte
Recentemente, escrevi um artigo sobre maneiras de garantir que uma variável seja um número válido: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md O artigo explica como garantir ponto flutuante ou número inteiro, se for o caso importante (
+x
vs~~x
).O artigo pressupõe que a variável é a
string
ou anumber
para começar etrim
está disponível / preenchida com polyfilled. Não seria difícil estendê-lo para lidar com outros tipos também. Aqui está a carne:fonte
Minha tentativa de um pouco confuso, talvez não seja a melhor solução
fonte
042
) e hexadecimal (0x45f
)Na minha aplicação, estamos apenas permitindo az AZ e 0-9 caracteres. Eu encontrei a resposta acima usando " string % 1 === 0" funcionou, a menos que a string iniciasse com 0xnn (como 0x10) e depois a retornaria como numérica quando não desejássemos. A armadilha simples a seguir na minha verificação numérica parece fazer o truque em nossos casos específicos.
Aviso : Isso pode estar explorando um bug antigo no Javascript e no Actionscript [Number ("1" + the_string)% 1 === 0)]. Não posso falar sobre isso, mas é exatamente o que precisávamos.
fonte
% 1
operação numérica neles), e isso interpretará a string como um literal hexadecimal ou flutuante.Minha solução:
Você pode adicionar condições adicionais dentro do loop, para atender às suas necessidades específicas.
fonte
Você pode fazer uso de tipos, como na biblioteca de fluxo y, para obter uma verificação estática e do tempo de compilação. Claro que não é muito útil para a entrada do usuário.
fonte
Aqui está uma lista para verificar se
sNum
é um valor numérico válido; foi testado para uma ampla variedade de entradas:fonte
Basta usar
isNaN()
, isso converterá a string em um número e, se receber um número válido , retornaráfalse
...fonte
Estou usando o seguinte:
fonte
1..1
,1,1
,-32.1.12
e, mais importante falhaundefined
eNaN
. Se você aprovouundefined
ouNaN
lhe devolveu um falso positivo, dizendo que era um número.