Classe que eu criei para verificar números válidos. OPINEM =)

7 respostas
I

Então pessoal. Eu criei uma classe com métodos que verificam se um número Inteiro ou Real é um número válido e retorna true ou false. Vou mandar o código fonte da classe para vocês darem uma opinião a respeito.

exemplo de uso:

String sReal = "";
		while(!VerificadorDecimal.ehNumeroReal(sReal))
			sReal = JOptionPane.showInputDialog("Digite um número real válido:");

Então, o método ehNumeroReal eh um método estático que recebe uma String e verifica se é um número real válido retornando uma boolean.
O método ehNumeroInteiro funciona da mesma maneira.

public class VerificadorDecimal
{
	public static boolean ehNumeroInteiro(String s)
	{
		if(ehNulo(s))
			return false;
		
		if(emBranco(s))
			return false;
		
		if(!ehDigito(s.charAt(0))&&!ehSinal(s.charAt(0)))
			return false;
		
		for(int i = 1; i < s.length() ;i++)
		{
			if (!ehDigito(s.charAt(i)))
			{
				return false;
			}
		}
		return true;
	}
	
	public static boolean ehNumeroReal(String s)
	{
		if(ehNulo(s))
			return false;
		
		if(emBranco(s))
			return false;
		
		if(!ehDigito(s.charAt(0))&&!ehSinal(s.charAt(0))&&!ehPonto(s.charAt(0)))
			return false;
		
		boolean tevePonto = false;
		if(ehPonto(s.charAt(0)))
		{
			tevePonto = true;
			if(s.length()==1)
				return false;
		}
		
		if(ehSinal(s.charAt(0))&&ehPonto(s.charAt(1))&&s.length()==2)
			return false;
		
		for(int i = 1; i < s.length() ;i++)
		{
			if (!ehDigito(s.charAt(i))&&!ehPonto(s.charAt(i)))
			{
				return false;
			}
			if(ehPonto(s.charAt(i)))
			{
				if(tevePonto)
				{
					return false;
				}
				tevePonto = true;
			}
		}
		return true;
	}
	
	private static boolean ehNulo(String s)
	{
		return s==null;
	}

	private static boolean ehPonto(char c)
	{
		return c=='.';
	}
	
	private static boolean ehDigito(char c)
	{
		return Character.isDigit(c);
	}

	private static boolean ehSinal(char c)
	{
		return c=='+'||c=='-';
	}

	private static boolean emBranco(String s)
	{
		return s.equals("");
	}
}

NAO ESKEÇAM DE RESPONDER O TÓPICO DIZENDO O QUE ACHARAM OU SE MEU CÓDIGO FOI ÚTIL PARA VOCÊ.

7 Respostas

T
Muito complicado, e no caso de números reais, pode rejeitar números perfeitamente válidos ou aceitar números inválidos. (Preciso testar um monte de alternativas, fiquei com um pouco de preguiça de analisar o código todo que é um pouco complicado.)

É mais fácil usar um try { Integer.parseInt (s); return true; } catch (Exception ex) { return false; } no caso de números inteiros, e try { Double.parseDouble (s); return true; } catch (Exception ex) { return false; }.

Se bobear é mais rápido também (pelo menos em PL/SQL no Oracle 7 tratar a exceção é mais rápido que checar os dígitos e ver se eles seguem a formatação adequada.)

EDIT - olhei o código e parece que, no caso de números reais, ele não aceita números válidos (principalmente em notação científica, como 1E-10) mas não parece aceitar números inválidos (só que preciso rodar o programa e testar na marra; só de ler um programa é difícil saber).

Uma expressão regular pode ser usada tanto no caso de inteiros quanto de doubles, mas no caso de doubles a expressão regular é muito complexa - é mais bem rápido tratar a exceção que compilar a expressão regular e usá-la para checar se bate ou não com um double.

I

Está infalível, eu testei com todos os tipos de valores possíveis e ele nao ignora nenhum tipo de valor válido e não aceita nenhum tipo de valor inválido. Ele aceita inclusive valores como -.3 (-0.3), .5 (0.5)…

Lançar uma exceção seria extremamente mais fácil e rápido porém o meu propósito fazendo isso é exatamente evitar o uso de tratamento de exceções.

I

Notações científica ele realmente não aceita. Meu intuito foi testar apenas números reais comuns, números por extenso.

Qualquer hora vou tentar implementar as notações científicas. Não tinha pensado nisso…

T

É um bom exercício testar com a notação científica.
Você já ouviu falar de máquinas de estados, analisadores léxicos, ou expressões regulares?
Você vai ver que o diagrama para efetuar o “parse” de um número em notação científica é meio grandinho e que dá um trabalho considerável checar a tal notação científica.
(Eu já fiz isso e digo que é um porre, mas nada que seja impossível).

I

Hmm… eu não entendo nada de notação científica… Se você puder me passar exemplos de todos os tipos diferentes de números em notação científica eu posso tentar implementar uma verificação.

T

Para os números em notação científica aceitos pelo Java, a referência é a Java Language Specification - cap. 3.10.2, mas posso dar alguns exemplos.

0.1E22
0.1e+22
0.1E-22
1.0e-22
1.E-22
1E22
.0E-22
0.0E22f
0.0E-22F
0.0E22d
0.0E022D
0xcafeP-23 // notação hexadecimal (usa P em vez de E), surgiu com o Java 5.0
0x0ca.FEp+23
0Xca.FEP+23

I

Notação com ‘E’ eu já implementei, não deu lá tanto trabalho… mas essa para de F, P e essas outras loucuras aí eu não vou nem tentar. Só de olhar já me deixa estressado.

Eu vou é jogar wii que eu ganho mais UAEUHuaeuhaeuhaeuhae… Ainda não fechei Metroid Prime 3.

Quando eu precisar de alguma coisa do tipo em um programa eu vo é dar um try catch mesmo aehaehaehaehaehaeh…

Criado 22 de novembro de 2007
Ultima resposta 24 de nov. de 2007
Respostas 7
Participantes 2