Oi Pessoal
Preciso de uma ajuda :oops:
Estou fazendo uma classe a qual tem como atributo cpf, fiz dois métodos nessa classe uma é para fazer uma máscara e outro método retorna um tipo boolean onde verifica se ele não é nulo e veio no formato da máscara que eu criei.
Ai é que está o problema, quero que ele verifique se o numero que entrou pela linha de comando está no formato definido no método criaMascara.
public MaskFormatter criaMascara() {
MaskFormatter mascCpf = null;
try {
mascCpf = new MaskFormatter("***.***.***-**");
} catch (Exception e) {
}
return mascCpf;
}
public boolean isCpfValido() {
if ((cpf != null) && (cpf.equals(mascCpf))){
System.out.print(true);
return true;
}
else{
System.out.print(false);
return false;
}
}
o resultado sai falso;
Sei que uma parte do método isCpfValido() está incorreto, mas já tentei de tudo, alguém poderia me informar se há outra maneira de verificar se o cpf que vir pela linha de comando é igual ao formato que eu defini pro cpf na minha classe?
Desde já agradeço a colaboração!!! :-o
Ólhei por cima, mas de cara já te digo que vc não deve usar .equals pra comparar um formato pq o .equals compara o VALOR da String.
No caso, independente do q vc digitar ele vai comparar com um monte de letras x e não é isso que vc quer né.
olha, eu te aconselho a fazer mais do que isso para validar um CPF, existe uma logica de criacao de CPFs e CNPjs que precisa ser verificada. Caso contrario se pode colocar qualquer numero com a formatacao correta que passa como valido…
Eu sugiro essa :
//-------- Valida CPF ou CNPJ
public boolean validaCPF_CNPJ(String s_aux) {
//------- Rotina para CPF
if (s_aux.length() == 11 ) {
int d1, d2;
int digito1, digito2, resto;
int digitoCPF;
String nDigResult;
d1 = d2 = 0;
digito1 = digito2 = resto = 0;
for (int n_Count = 1; n_Count < s_aux.length() -1; n_Count++) {
digitoCPF = Integer.valueOf(s_aux.substring(n_Count -1, n_Count)).intValue();
//--------- Multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.
d1 = d1 + ( 11 - n_Count ) * digitoCPF;
//--------- Para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.
d2 = d2 + ( 12 - n_Count ) * digitoCPF;
};
//--------- Primeiro resto da divisão por 11.
resto = (d1 % 11);
//--------- Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.
if (resto < 2)
digito1 = 0;
else
digito1 = 11 - resto;
d2 += 2 * digito1;
//--------- Segundo resto da divisão por 11.
resto = (d2 % 11);
//--------- Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.
if (resto < 2)
digito2 = 0;
else
digito2 = 11 - resto;
//--------- Digito verificador do CPF que está sendo validado.
String nDigVerific = s_aux.substring(s_aux.length()-2, s_aux.length());
//--------- Concatenando o primeiro resto com o segundo.
nDigResult = String.valueOf(digito1) + String.valueOf(digito2);
//--------- Comparar o digito verificador do cpf com o primeiro resto + o segundo resto.
return nDigVerific.equals(nDigResult);
}
//-------- Rotina para CNPJ
else if (s_aux.length() == 14) {
int soma = 0, aux, dig;
String cnpj_calc = s_aux.substring(0,12);
char[] chr_cnpj = s_aux.toCharArray();
//--------- Primeira parte
for( int i = 0; i < 4; i++ )
if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )
soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
for( int i = 0; i < 8; i++ )
if ( chr_cnpj[i+4]-48 >=0 && chr_cnpj[i+4]-48 <=9 )
soma += (chr_cnpj[i+4] - 48) * (10 - (i + 1));
dig = 11 - (soma % 11);
cnpj_calc += ( dig == 10 || dig == 11 ) ?
“0” : Integer.toString(dig);
//--------- Segunda parte
soma = 0;
for ( int i = 0; i < 5; i++ )
if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )
soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
for ( int i = 0; i < 8; i++ )
if ( chr_cnpj[i+5]-48 >=0 && chr_cnpj[i+5]-48 <=9 )
soma += (chr_cnpj[i+5] - 48) * (10 - (i + 1));
dig = 11 - (soma % 11);
cnpj_calc += ( dig == 10 || dig == 11 ) ?
“0” : Integer.toString(dig);
return s_aux.equals(cnpj_calc);
} else
return false;
}
Para resolver o problema da formatacao voce pode utilizar uma funcao como a que mostrarei a seguir que retira qualquer tipo de caracter de uma string :
public String retiraChar(String digitado) {
String Result="";
for(int i=0; i<digitado.length() ; i++){
for (Integer j=0 ; j<10 ; j++){
if( (""+digitado.charAt(i)).equals((""+j)) ){
Result+=digitado.charAt(i);
}
}
}
return Result;
}
Ou vc pode manter a sua mascara em um jformattedtextfield que faz muito bem esse papel…
Agente aprende essa rotina na faculdade mas nunca decora né.
Aliás, não dá pra validar cnpj desse jeito né. Pq o digito de verificação na verdade seria a filial
Oi Fabio
Valeu mesmo pela dica, só que achei um código muito complexo pra colocar em projeto de faculdade, gostaria de uma coisa bem simples,
preciso que ao entrar um número, ele verifique que não seja nulo, que corresponde ao numero padrão pra cpf e que não deixe entrar letras…só isso bem simples…
Sei q já estou amolando :oops:…rs…Mas se puderem me dar uma dica agradeço, estou a dias tentando achar algo bem simples assim!!!
abs
Patricia 
Pessoal
Consegui fazer uma boa parte do que precisava, só que travei em uma opção de validação para cpf, preciso fazer uma rotina para verificar se ao invés de números, foi digitado letras, para que eu gere uma messagem de alerta, mas não estou conseguido…
Achei esse código aqui mas não está dando certo, saberiam dizer o que está errado, ou se existe uma outra opção? :oops:
if ((cpf == null) && (cpf.trim().length() != 11)) {
for (int i = 0; i < cpf.length(); i++) {
if (!Character.isDigit(cpf.charAt(i))) {
JOptionPane.showMessageDialog(null, "CPF não contém letras somente números! ");
}
}
}
ele gera uma exceção: java.lang.NumberFormatException,
quando insiro letras ao invés de numeros, quero que apareça a mensagem do showMessageDialog.
Alguém poderia me dar esse help!!!
pls :roll:
abs
Patricia
Fábio
Você poderia me explicar só um detalhe da rotina do cnpj? :oops: :?:
Porque é usado o indice [i] -48?
Não entendi porque desse -48???
Só queria entender isso… :?:
Aguardo sua resposta
Obrigada
abs
Patricia
Ola…
Tenta assim
try{
if ((cpf == null) && (cpf.trim().length() != 11)) {
for (int i = 0; i < cpf.length(); i++) {
if (!Character.isDigit(cpf.charAt(i))) {
JOptionPane.showMessageDialog(null,
"CPF não contém letras somente números! ");
}
}
}
}catch(NumberFormatException e){
JOptionPane.showMessageDialog(null, "Erro", "Msg",
JOptionPane.WARNING_MESSAGE);
System.out.print("Por Favor, insira um CPF valido!");
}
mas facil que tentar descobrir o que o usuario digitou…
fui!!!
olá…RPATRICIA…
o negócio é o seguinte…
1º passo: voce irá criar duas classes: 1º - LimitedIntegerJTextField e a 2º - LimitedTextField
2º passo: adiciona os imports, ou o que mais precisar… é beem facim…
3º passo: depois de ter as duas classes (vale lembrar: NO MESMO PACOTE), voce cria um objeto da classe LimitedIntegerJTextField.
assim: LimitedIntegerJTextField po = new LimitedIntegerJTextField(11); na sua classe principal. onde está localizada a JTextField do CPF e/ou CNPJ.
vale lembrar: o numero 11 é o tanto de numeros maximos do seu campo CPF, que por sinal tambem so ira aceitar NUMEROS e não LETRAS. e voce pode
fazer isso tambem para limitar um campo de senha ou rg. qualquer um.
4º passo: feito isso, voce atribui o objeto do seu JTextField com o objeto da sua classe LimitedIntegerJTextField.
assim:
JTextField campoCpf = new JTexField();
campoCpf.setBounds(50,55,40,60); //localização do campoCpf
LimitedIntegerJTextField limit = new LimitedIntegerJTextField(11);
campoCpf = limit;
PROOONTINHO!!! abaixo segue as duas classes, de mão beijada… que eu demorei anos pra encontrar e fazer as modificações!!!
Espero ter ajudado…
1º CLASSE
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class LimitedIntegerJTextField extends LimitedTextField{
public LimitedIntegerJTextField(int maxLength) {
super(maxLength);
this.addKeyListener(new KeyListener(){
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
if(!Character.isDigit(c) && KeyEvent.VK_BACK_SPACE != c){
e.consume();
}
}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
});
}
private String oldValue;
public void paste(){
this.oldValue = getText();
super.paste();
if(!isNumeros(getText())) {
setText(this.oldValue);
}
}
/**
* Obtem uma string que representa os números digitados no campo, e verifica se na string
* possui apenas números.
* @param valor
* @return
*/
private boolean isNumeros(String valor) {
final String NUMEROS = "0123456789";
for (int i = 0; i < valor.length(); i++) {
char caracter = valor.charAt(i);
if(NUMEROS.indexOf(caracter) == -1) {
return false;
}
}
return true;
}
}
2º CLASSE
import javax.swing.JTextField;
import java.awt.event.*;
public class LimitedTextField extends JTextField{
private byte maxLength=0;
public LimitedTextField(int maxLength){
super();
this.maxLength= (byte)maxLength;
this.addKeyListener(new LimitedKeyListener());
}
public void setMaxLength(int maxLength){
this.maxLength= (byte)maxLength;
update();
}
private void update(){
if (getText().length()>maxLength){
setText(getText().substring(0,maxLength));
setCaretPosition(maxLength);
}
}
public void setText(String arg0){
super.setText(arg0);
update();
}
public void paste(){
super.paste();
update();
}
//Classes Internas
private class LimitedKeyListener extends KeyAdapter{
private boolean backspace= false;
public void keyPressed(KeyEvent e){
backspace=(e.getKeyCode()==8);
}
public void keyTyped(KeyEvent e){
if ( !backspace &&
getText().length()>maxLength-1){
e.consume();
}
}
}
}