É vantajoso o uso de ParseInt para validar números?
A utilização do parseInt para validar números em muitos casos não é a solução mais efetiva, devido a que permite a presença de letras e/ou espaços, e o resultado poderia não ser o esperado.
A utilização do parseInt para validar números em muitos casos não costuma ser a solução mais efetiva, devido a que permite a presença de letras e/ou espaços, e o resultado poderia não ser o esperado.
Por que parseInt pode causar problemas?
Esta pergunta se responde a si mesma vendo vários exemplos sobre o funcionamento de parseInt:
"123456": este String retorna como resultado o número 123456 o qual é o resultado esperado.
"123456asd": este String retorna como resultado o número 123456 apesar de que o String continha letras (vantagem ou desvantagem?).
"asd": este String retorna como resultado NaN o qual é o resultado esperado.
"": este String vazio retorna como resultado NaN o qual é o resultado esperado.
" 123456asd": este String (que contém vários espaços no início do número e letras no final) retorna como resultado o número 123456 (vantagem ou desvantagem?).
" 123 123 asd" este String (que contém espaços e letras) retorna como resultado o número 123 (vantagem ou desvantagem?).
Como se pode observar, parseInt apresenta o seguinte comportamento:
Retornará um número válido si: O String começa por um número.
O String começa por espaço(s) seguido de um número.
Exemplos de números válidos: "123456"
" 123456"
"12345asdasd"
" 12345 asdd"
Todo String que cumpra com as 2 regas anteriores (ser um número válido), será truncado: quando se encontre uma letra, espaço ou caracteres especiais (vírgulas, acentos,...) dentro do String. Como resultado, retornará os dígitos que estejam mais à esquerda da primeira letra (espaço ou caractere) encontrada.
Exemplos de números válidos truncados: "123456" retorna como resultado 123456
" 123456" retorna como resultado 123456
"12345asdasd" retorna como resultado 12345
" 123.. asdd" retorna como resultado 123
Uma alternativa ao parseInt, que valida que os String contenham só números está a seguir:
function validarNumero(c_numero)
{
//checar a longitude de c_numero:
// Si (c_numero.length é igual a Zero) quer dizer que c_numero é uma cadeia Vazia.
// Se (c_numero.length é diferente(maior) de Zero) podemos assegurar que c_numero contém pelo menos uma letra
//a qual se pode fazer a validação
if (c_numero.length == 0)
{
return "NaN";
}
else
{
//Percorre-se c_numero por todos seus caracteres checando que todos sejam dígitos
//a condição >="0" e <="9" é baseada no valor ascii que têm os números na tabela ascii.
//Se algum dos caracteres não for um número a função retornará um NaN
//Senão retornará o Número
for (i = 0; i < c_numero.length; i++)
{
if (!((c_numero.charAt(i) >= "0") && (c_numero.charAt(i) <= "9")))
return "NaN";
}
return c_numero;
}
}
Exemplos de validação de números
utilizando a função ParseInt:
utilizando a função validarNumero (chamando à função validar):
utilizando a função validarNumero (chamando à função validarComplexo):