Verificar se é o numero ou letra

Olá pessoal, fiz um pequena busca no forum e não achei nada que tratasse desse assunto.

eu preciso fazer um software que verifica a placa de um carro se é valida.

declarei uma string para receber a placa, verifica se tem 7 digitos , já que é a quantidade de character da placa
separei em outras 2 strings

os 3 primeiros character vai pra string letras
os 4 finais vão para a string numeros

agora eu gostaria de saber se existe uma função, que percorra a string e verifica cada character se é letra e se é numero, pra q eu possa assim validar a placa.

espero ter sido claro.

import javax.swing.* ;
public class PllacaCarro {
     public static void main(String[] args){
    	 String placa = JOptionPane.showInputDialog(null, "Digite a placa do carro");
    	 String letras  ="";
    	 String numeros ="";
    	

    		 	if(placa.length() == 7){
    	
    		  		letras = placa.substring(0, 2);
    		 		numeros = placa.substring(3, 6);
    		 	
    		 	}else{	
    		 			JOptionPane.showMessageDialog(null, "Placa invalida");
    		 	}

Boa tarde, para fazer esta comparação você deve usar a classe Character, ele possui métodos de apoio ao tratamento de caracteres, entre eles os métodos isLetter e isDigit, abaixo um exemplo:

char letra = 'a';
Character.isLetter(letra);
Character.isDigit(letra);
1 curtida

Utilize o metedo isDigit da classe Character e o isNumber , ai e so percorrer a string e ir fazendo a comparação …


String letras="aeiou";

        for (int i = 0; i < letras.length(); i++) {
          if (Character.isDigit(letras.charAt(i))==true)
          {
              System.out.println("Possui numeros");
              break;
          }

        }

flw

1 curtida

Ou pode usar uma expressão regular:

http://java.sun.com/docs/books/tutorial/essential/regex/index.html

Ou talvez usar algo já pronto.

import org.apache.commons.lang.StringUtils;
!StringUtils.isNumeric("ABC");
StringUtils.isNumeric("1234");

[]'s
JL

[quote=jctosta]Boa tarde, para fazer esta comparação você deve usar a classe Character, ele possui métodos de apoio ao tratamento de caracteres, entre eles os métodos isLetter e isDigit, abaixo um exemplo:

char letra = 'a'; Character.isLetter(letra); Character.isDigit(letra); [/quote]

utilizei a função valew pela dica, era isso mesmo que eu precisava, testei ela e funciona legal

[quote=tinorberto]Utilize o metedo isDigit da classe Character e o isNumber , ai e so percorrer a string e ir fazendo a comparação …


String letras="aeiou";

        for (int i = 0; i < letras.length(); i++) {
          if (Character.isDigit(letras.charAt(i))==true)
          {
              System.out.println("Possui numeros");
              break;
          }

        }

flw[/quote]

tive essa mesma ideia mas ta dando erro em tempo de execução , acho que o charAt não está aceitando uma variavel como parametro

está dando o seguinte erro

Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: 2
at java.lang.String.charAt(Unknown Source)
at PllacaCarro.main(PllacaCarro.java:25)

import javax.swing.* ;
public class PllacaCarro {
     
	public static void main(String[] args){
    	 String placa = JOptionPane.showInputDialog(null, "Digite a placa do carro");
    	 String letras  ="";
    	 String numeros ="";
    	 boolean valido = true;
    	char ch ; 
    	String fimPl = placa.substring(6)  ;
    	int fimPlaca = Integer.parseInt(fimPl);
    		 	
    	
    	
    	if(placa.length() == 7){
    	    		 		letras = placa.substring(0, 2);
    		 		numeros = placa.substring(3, 6);
                   		 	}else{	
    		 			JOptionPane.showMessageDialog(null, "Placa invalida");
    		 			valido = false;
    		                   	}
    	      	
if(valido == true ){   		 
    		 	for(int a =0; a<3; a++){
		 			ch = letras.charAt(a);
    		 		if(Character.isLetter(ch))
    		 		{
    		 		}else{
        		 		JOptionPane.showMessageDialog(null, "Os 3 primeiros caracters devem ser letras");
    		 		   valido = false;
        		 		break;
        		 		}
    		 	                         }
  
    		 	
    	
    		 	for(int b = 0; b <3; b++){
    		 		ch = numeros.charAt(b);
    		 			if(Character.isDigit(ch))
    		 			{
    		 			}else{
    		 				JOptionPane.showMessageDialog(null, "Os 4 ultimos caracters devem ser numeros");
    		 		valido = false;		
    		 		break;
    		 	    		 		}
                             		 	
	}
}

se alguem puder me explicar outra maneira, agradeço.

Na verdade você está acessando uma posição que não existe na String
Acho que o melhor a fazer é usar expressão regular

[code]
public static void main(String[] args) {
String placa1 = “JTL4968”;
String placa2 = “JT49A68”;
String placa3 = “JTL4968A”;
String placa4 = “4968JTL”;

    Pattern p = Pattern.compile("[a-zA-Z]{3}[0-9]{4}");
    
    System.out.println(p.matcher(placa1).matches());
    System.out.println(p.matcher(placa2).matches());
    System.out.println(p.matcher(placa3).matches());
    System.out.println(p.matcher(placa4).matches());

}[/code]

Como disse o davidtiagoconceicao:

placa.matches("\p{L}{3}\d{4}")

Além de não usar dependência, pode ser feita numa linha e nem precisa testar o tamanho da String.

[quote=ozix]Como disse o davidtiagoconceicao:

placa.matches("\p{L}{3}\d{4}")

Além de não usar dependência, pode ser feita numa linha e nem precisa testar o tamanho da String.[/quote]

eu preciso testar o tamanho pra evitar que o usuario digite uma placa com mais do que 7 caracteres

pq ABC12345 eh invalida

e assim eu testaria só os 7 primeiros digitos, se so 7 primeiros se enquadrassem seria aceito mesmo sendo invalido, entendeu ?

Thiago, não entendi por que o meu “for”, ta acessando posição que não existe na string,

Você não entendeu. O que eu quis dizer é que a regex já testa o tamanho. Seu código ficaria assim:

if (!placa.matches("\p{L}{3}\d{4}")) { JOptionPane.showMessageDialog(null, "Placa invalida") }

poxa… assim não resolve?

° Pegar a parte que deveria ser número e…

try { Integer.parseInt(SuaVariavelQueContemONumero); JOptionPane.showMessageDialog(null,"O valor é numerico", "Numero", JOptionPane.INFORMATION_MESSAGE); } catch(NumberFormatException ex) { JOptionPane.showMessageDialog(null,"O valor contém caracters alfanuméricos", "Alfanumerico", JOptionPane.ERROR_MESSAGE); }

proucure melhor antes de postar, ja existem foruns que resolvem sua pergunta

[quote=Usuk][quote=ozix]Como disse o davidtiagoconceicao:

placa.matches("\p{L}{3}\d{4}")

Além de não usar dependência, pode ser feita numa linha e nem precisa testar o tamanho da String.[/quote]

eu preciso testar o tamanho pra evitar que o usuario digite uma placa com mais do que 7 caracteres

pq ABC12345 eh invalida

e assim eu testaria só os 7 primeiros digitos, se so 7 primeiros se enquadrassem seria aceito mesmo sendo invalido, entendeu ?

Thiago, não entendi por que o meu “for”, ta acessando posição que não existe na string, [/quote]

1º Se você chegou a testar os códigos com regex que foi enviado a você, você veria que se for digitado uma placa com menos do que 7 dígitos, ele não iria aceitar
2º Traduza a satcktrace Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: 2 e verá que o vetor tem menos do 2 posições e você está tentando acessá-la :wink:

[quote=thiago.correa][quote=Usuk][quote=ozix]Como disse o davidtiagoconceicao:

placa.matches("\p{L}{3}\d{4}")

Além de não usar dependência, pode ser feita numa linha e nem precisa testar o tamanho da String.[/quote]

eu preciso testar o tamanho pra evitar que o usuario digite uma placa com mais do que 7 caracteres

pq ABC12345 eh invalida

e assim eu testaria só os 7 primeiros digitos, se so 7 primeiros se enquadrassem seria aceito mesmo sendo invalido, entendeu ?

Thiago, não entendi por que o meu “for”, ta acessando posição que não existe na string, [/quote]

1º Se você chegou a testar os códigos com regex que foi enviado a você, você veria que se for digitado uma placa com menos do que 7 dígitos, ele não iria aceitar
2º Traduza a satcktrace Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: 2 e verá que o vetor tem menos do 2 posições e você está tentando acessá-la ;)[/quote]

eu ainda sou iniciante em java, nem todas as propostas aqui eu entendo muito bem, como essa do regex,
sobre minha string eu vi o erro só depois, pois eu estava colocando substring(0, 2) e ele nao pega a posição final, eu pensei que pegava, valew pela ajuda agora o software está funcionando legal o/.

Use Expressões Regulares.

[code]
package validacaoPlacaCarro;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PlacadeCarroComER {
public static void main(String[] args) {

	String placa = "s1a0320";
	int fim=0;
			
	Pattern pattern = Pattern.compile("[a-zA-Z]{3}-?[0-9]{4}");
	Matcher matcher = pattern.matcher(placa);
	
	if(matcher.find()){
		fim = matcher.end();
	}
	if(fim==7){
		System.out.println("A placa é válida e é de Moto");
	}else if(fim==8){
		System.out.println("A placa é válida e é de Carro");			
	}else{
		System.out.println("Não é uma placa válida");			
	}

}[/code]