Verificar a existência de um inteironuma string

5 respostas
N

olá pessoal!

Preciso novamente de uma ajuda

Estou a tentar, verificar a existência de um inteiro numa variavel.

Ou seja, numa string no formato “HH:MM” (por exemplo: “12:30”) verificar a existência de valores inteiros nas posições HH e MM de forma a que exemplos como estes possam ser detectados:

–“a2:30”
–“1a:30”
–“12:a0”
–“12:3a”

podem ajudar-me?

sem mais, um abraço

5 Respostas

fradys

Olá Nothunt,

Bem eu ja passei por isso, eu não sei se seria a melhor solução, mas eu fiz assim:

1º Fiz um array contendo todos os numeros, de 0 a 9;
2º Fiz um for para procurar por todas as letras testando cada posição se tem alguma posição que combina com o array, caso tenha então é um número.

o código fica mais ou menos assim :

public boolean testaHora( String hora )
{
       String[] numeros = {"0", "1", "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9"};
       boolean somenteNumeros = true;
       
       for ( int i = 0; i < hora.length(); i++ )
       {
               for ( int j = 0; j < numeros.length; i++ )
               {
                        //Aqui faz o teste de negação:
                        // "1" NÃO é igual a "1"? 
                        //R: FALSO "1" É IGUAL A "1"
                        // Se é FALSO, então não entra no if....
                        if ( !hora.substring( i , i + 1 ).equals( numeros[ j ] ) )
                        {
                                return false;
                         }
               }

        }

       
       return somenteNumeros;
}

Como já disse, não sei se seria o melhor código, ainda mais tendo dois for, mas funciona, só que terá que testar o padrão de HH:MM, com os 2 pontos no meio, pode ser feito com uma substring:

if ( hora.substring( 0 , 3 ).equals( “:” ) )

{

//hora esta no padrão: HH:MM

}

Mas isso estamos falando de código feito na mao, uma melhor solução seria usar a API ( lembrei agora ). Usando a classe Time não tem erro, abaixo tem um trecho de como faria:

import java.sql.Time;

public boolean testaHora( String hora )
{
       boolean horaOK = false;
       String horaAlterada = "";

       try
       {
               //Transforma uma String em Time, caso tenha um número ou
               // Não esteja no formato: HH:MM:SS então da erro. 
               horaAlterada = "" + Time.valueOf( hora );

               if ( horaAlterada.equals( hora ) )
               {
                     horaOK = true;
               }
       }
       catch( Exception e )
       {
              e.printStackTrace();
       }

       return horaOK;

}

Eu não tenho certeza que esteja 100% correto, pois não compilei nem testei os códigos, estou postando o que me lembro ( 00:30 e meia duzia de latinhas de cerveja, espero não ter confundido nada ).

Mas tente esses 2 códigos e tenha preferencia em usar a API, a legibilidade e o entendimento do código melhoram.

Espero ter ajudado, qualquer dúvida ou observação, poste novamente!

Boa Sorte!

davidbuzatto

Não é mais fácil usar uma expressão regular?

Implementei um método que verifica se uma string é uma hora com minuto e segundo, usando padrão de 24 horas

import java.util.regex.*;

.
.
.

public boolean ehHora( hora ) {
	
	// padrão de dois dígitos, um dois pontos e mais dois dígitos
	Pattern padrao = Pattern.compile( "\d{2}[:]\d{2}" );
	Matcher verificador = padrao.matcher( hora );
	
	// verifica a string
	if ( verificador.matches() ) {
		
		// quebra a string usando o : como separador
		String[] valores = aVerificar.split( "[:]" );
		
		// verifica se os valores estão corretos
		if ( Integer.parseInt( valores[ 0 ] ) > 23 )
			return false;
			
		if ( Integer.parseInt( valores[ 1 ] ) > 59 )
			return false;
			
		// todas as verificações ok, retorna true
		return true;
		
	}
	
	
	return false;
	
	
}

Falow!

antoniopopete

Só responde uma coisa.Esse “a” no meio da hora é “normal” para sua aplicação ou não?Porque se puder ter esse “a” no meio,acho que a expressão regular

Implementei um método que verifica se uma string é uma hora com minuto e segundo, usando padrão de 24 horas

não vai resolver seu problema,mas…a solução melhor mesmo é a expressão regular.

davidbuzatto

não vai resolver seu problema,mas…a solução melhor mesmo é a expressão regular.

Implementei como exemplo, agora é só o kra olhar a documentação e alterar para o que ele precisa.

fradys

Não tinha pensado em usar padrões, mas se a aplicação for gráfica, pode usar o JFormattedTextField, com ele você pode definir o que o usuário vai poder digitar, por exemplo:

import javax.swing.JFormattedTextField;

JFormattedTextField formatText = null;

MaskFormatter mask = null;
try
{
      mask = new MaskFormatter( "##:##" );
}
catch ( Exception e )
{
      e.printStackTrace();
}

formatText = new JFormattedTextField( mask );

Com isso pode definir que somente numeros vão ser aceitos ( usar o asterisco “#” define que somente números são aceitos ) no text field, ou seja, o usuário não poderá digitar nenhuma letra, e assim que ele começar a digitar a hora automaticamente já vai ficar com os 2 pontos no meio. O único problema é que este tipo vai permitir apenas números, mas não vai impedir que coloque hora incorreta, ex: 27:40, 12:67…
ai vai ter que ter outro tipo de teste, que já foi discutido pelo davidbuzatto ai em cima.

Dai é escolher o melhor método!

Criado 27 de janeiro de 2007
Ultima resposta 28 de jan. de 2007
Respostas 5
Participantes 4