É número?

14 respostas
bcartaxo

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.

Vlw pessoal.

14 Respostas

maquiavelbona

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

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 :slight_smile:

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.

Até!

Bem lembrado :slight_smile:

cassio

Pensando bem, essa solução seria melhor

public boolean isNumeroRegex(String s) {
	return (s.matches("-?[0-9]+.?[0-9]*"));
}
kaique

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
  1. 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.

  2. 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.

Até!

Criado 7 de outubro de 2007
Ultima resposta 16 de out. de 2007
Respostas 14
Participantes 8