Alguém sabe se existe algum metódo de alguma classe =P q informe se uma String é um número, seja ele inteiro ou real. Preciso validar se uma String é um número antes de dá o parse, até sei que da pra fazer um algoritmo usando alguns outros métodos, que resolveriam isso, mas um métood que faça isso diretamente iria ser bem útil.
Se não quiser usar excessões como nosso amigo maquiavelbona falou, você pode fazer algo do tipo
public class TesteNumero {
/**
* Os numeros de 0-9 sao representandos na tabela ascii pelos codigos de 48 a 57 (em decimal).
* Para cada caracter presente na String, basta verificar se seu codigo ascii está nesta faixa.
*/
public boolean isNumero(String s) {
char c;
for(int i = 0; i < s.length(); ++i) {
c = s.charAt(i);
if(c < 48 || c > 57) return false;
}
return true;
}
public static void main(String[] args) {
TesteNumero testeNumero = new TesteNumero();
if(testeNumero.isNumero(args[0]))
System.out.printf("%s eh um numero!\n", args[0]);
else
System.out.printf("%s nao eh um numero!\n", args[0]);
}
}
Esse método isNumero() que eu escrevi não reconhece números negativos. Fica para você como lição de casa
da pra fazer o teste com qualquer numero com o metodo: NumberFormat.getInstance().parseObject(“string”); caso nao seja um numero ele lança a exceçao ParseException
É eu pensei justamente em usar os parsers e tratando as exceções, com isso dava pra validar, mas tava querendo saber se ja tinha esse métood pronto para eu n ter o trablaho de fazê-lo =P mas pelo jeito vou ter q fazer mesmo. Vlw mais uma vez.
Não entendi qual é a grande perda de desempenho em trabalhar com exceções. Além de muitas vezes ser melhor trabalhar com exceções do que com retornos do tipo -1, false ou NaN.
[quote=maquiavelbona]Não entendi qual é a grande perda de desempenho em trabalhar com exceções. Além de muitas vezes ser melhor trabalhar com exceções do que com retornos do tipo -1, false ou NaN.
Até![/quote]
Achas que não é melhor fazer um método de validação do que trabalhar com exceções forçadas?
Uma expressão regular que bata exatamente com um número* demora bem mais para ser processada que uma rotina que faça um parseInt ou parseDouble e capture a exceção. Esquisito porém verdade. Só que é conveniente deixar isso “trancado” dentro de uma rotina utilitária.
Lembro que esse jeito de tratar a validação não é incomum - eu tinha lido um livro sobre Oracle 7 onde um problema semelhante era proposto, e o autor constatou que o mais rápido era mesmo fazer o equivalente em PL/SQL ao Java de capturar a exceção. Não sei como está a situação agora no Oracle 10 - pode ser que haja uma função pronta para isso.
Escrever uma expressão regular que bata exatamente com um número não é coisa simples, e como as expressões regulares são bastante complicadas, seu processamento (mesmo efetuando a pré-compilação) é bastante demorado.
[quote=peerless]…
Achas que não é melhor fazer um método de validação do que trabalhar com exceções forçadas?[/quote]
Não. Não em muitos casos de validação, transformação, consolidação etc. No mesmo exemplo de transformar um String em um número, o mesmo pode não ser, o que logicamente seria um valor avesso ao esperado, necessitando assim que haja um lançamento de exceção, ou achas melhor que nesse caso ele retorne -1, ou só false? Mas foi false por que? Porque a String é inválida, é inválida porque houve um problema interno ou sei lá o que?
Voltar a programar como fazíamos a 20 anos atrás não é benefício nenhum, muito menos com suposta relação a performance.