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.
Integer.parseInt() ou equivalentes e em caso falso, recolha a exceção. Não, não conheço nenhum método que faça essa verificação.
Até!
cassio
Se não quiser usar excessões como nosso amigo maquiavelbona falou, você pode fazer algo do tipo
publicclassTesteNumero{/** * 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. */publicbooleanisNumero(Strings){charc;for(inti=0;i<s.length();++i){c=s.charAt(i);if(c<48||c>57)returnfalse;}returntrue;}publicstaticvoidmain(String[]args){TesteNumerotesteNumero=newTesteNumero();if(testeNumero.isNumero(args[0]))System.out.printf("%s eh um numero!\n",args[0]);elseSystem.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
maquiavelbona
E seu código não verifica se esse número pode ser real. Pode também ser outra lição de casa.
Até!
PcAbrantes
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
bcartaxo
É 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.
cassio
maquiavelbona:
E seu código não verifica se esse número pode ser real. Pode também ser outra lição de casa.
Você também pode cada caractere da String e passando o mesmo para o método isDigit(char c) da classe Character…
[]'s.
peerless
Lembrando, que é sempre mais interessante, trabalhar com métodos, evitando ao máximo, utilizar exceções para este tipo de coisa. Dica de desempenho.
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é!
peczenyj
Usar expressões regulares é uma boa ideia, sobretudo se vc quiser fazer validações client-side.
peerless
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é!
Achas que não é melhor fazer um método de validação do que trabalhar com exceções forçadas?
T
thingol
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.
maquiavelbona
peerless:
…
Achas que não é melhor fazer um método de validação do que trabalhar com exceções forçadas?
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.