GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Como bloquear CPF com todos números iguais? (111.111.111-11)

Bom dia galera.

Tenho que bloquear todos os CPF com numeros iguais exemplo 000.000.000-00, 111.111.111-11 e assim por diante.

Se que tem varias soluções, como if de cada um, ou split e comparação.

Gostaria de saber se tem algum metodo ou regex que verifica se todos os caracteres da string são iguais?

Exemplo tenho a

String = “00000000000”, como verificar se todos são iguais.

Valew.

Acredito que o Stella faz isso. Não vi se tem os fontes para baixar, mas se tiver baixa e da uma olhada como foi feito, ou então usar a lib mesmo.

Faça melhor do que isso, valide o dígito verificador do CPF.
http://www.clubedainformatica.com.br/documentos/mostraartigo.php?artigo=62

Assim você barra outros valores inválidos, tais como:
123.456.789-00

[quote=ViniGodoy]Faça melhor do que isso, valide o dígito verificador do CPF.
http://www.clubedainformatica.com.br/documentos/mostraartigo.php?artigo=62

Assim você barra outros valores inválidos, tais como:
123.456.789-00
[/quote]

Mesmo validando, a entrada com td 1 por exemplo é válida :smiley:

Nesse caso, barrar esse CPF é fechar as portas para um cidadão brasileiro.

Nesse caso, barrar esse CPF é fechar as portas para um cidadão brasileiro.[/quote]

Existe o cpf 111.111.111-11, por consultei na receita, e em todos os casos ocorreu de cadastro não encontrado.

[quote=ViniGodoy]Faça melhor do que isso, valide o dígito verificador do CPF.
http://www.clubedainformatica.com.br/documentos/mostraartigo.php?artigo=62

Assim você barra outros valores inválidos, tais como:
123.456.789-00
[/quote]

Eu acredito que essa seja a melhor saída mesmo…

Mas se vc quiser…se seu CPF for String…vc pode ver com cpf.charAt()…vendo char por char…

Se for numero…vc pode fazer divisoes sucessivas por 10 (%) e comparar…

Nesse caso, barrar esse CPF é fechar as portas para um cidadão brasileiro.[/quote]

Existe o cpf 111.111.111-11, por consultei na receita, e em todos os casos ocorreu de cadastro não encontrado.[/quote]

Mas pode ser por outro motivo (vai ver o cara morreu). Melhor mesmo é verificar se o dígito verificador está correto, isso te previne uns 99% dos erros, pois os outros 1% depende de informações que só a Receita Federal tem.

[code]package modulo2;

import java.util.Scanner;

public class VerificarCPF {

public static void main (String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Digite o CPF (00000000000): ");
    String cpf = sc.nextLine();
    if (CPF(cpf)) {
        System.out.println ("Dígito válido!");
    }
    else {
        System.out.println ("Dígito inválido!");
    }
}

static public boolean CPF (String strCpf )

{
int d1, d2;
int digito1, digito2, resto;
int digitoCPF;
String nDigResult;

  d1 = d2 = 0;
  digito1 = digito2 = resto = 0;

  for (int nCount = 1; nCount < strCpf.length() - 1; nCount++)
  {
     digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();

     //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.
     d1 = d1 + ( 11 - nCount ) * digitoCPF;

     //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.
     d2 = d2 + ( 12 - nCount ) * 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 = strCpf.substring (strCpf.length()-2, strCpf.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);

}

}[/code]

Tá aí em Java…

[quote=claudneto][code]package modulo2;

import java.util.Scanner;

public class VerificarCPF {

public static void main (String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Digite o CPF (00000000000): ");
    String cpf = sc.nextLine();
    if (CPF(cpf)) {
        System.out.println ("Dígito válido!");
    }
    else {
        System.out.println ("Dígito inválido!");
    }
}

static public boolean CPF (String strCpf )

{
int d1, d2;
int digito1, digito2, resto;
int digitoCPF;
String nDigResult;

  d1 = d2 = 0;
  digito1 = digito2 = resto = 0;

  for (int nCount = 1; nCount < strCpf.length() - 1; nCount++)
  {
     digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();

     //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.
     d1 = d1 + ( 11 - nCount ) * digitoCPF;

     //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.
     d2 = d2 + ( 12 - nCount ) * 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 = strCpf.substring (strCpf.length()-2, strCpf.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);

}

}[/code]

Tá aí em Java…[/quote]

Valew pelo codigo, porém o CFP 00000000000, é considerado válido. E o meu cliente quer se seja bloqueado esses valores, vou dá mais uma pesquisada para verificar se realmente 00000000000 é inválido, ou há a possibilidade de exister esse cpf.

Obrigado.

Cara, em uma rápida consulta no site da Receita me pareceu que apenas o 000.000.000-00 é inválido. Para os outros existe a possibilidade de ser válido (inclusive o 888.888.888-88 tem dono :wink: )

[code]package modulo2;

import java.util.Scanner;

public class VerificarCPF {

public static void main (String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Digite o CPF (00000000000): ");
    String cpf = sc.nextLine();
    if (CPF(cpf)) {
        System.out.println ("Dígito válido!");
    }
    else {
        System.out.println ("Dígito inválido!");
    }
}

static public boolean CPF (String strCpf )

{
int d1, d2;
int digito1, digito2, resto;
int digitoCPF;
String nDigResult;
String verifica = “”;

  d1 = d2 = 0;
  digito1 = digito2 = resto = 0;
  for (int i = strCpf.length(); i >= 0; i--) { //verifica é o CPF ao contrario
      verifica = verifica + strCpf.charAt(i);
  }
  if (verifica.equals(strCpf)) { //Se o CPF ao contrario é igual o normal...os digitos são iguais...
      return false;
  }
  else {
      
    for (int nCount = 1; nCount < strCpf.length() - 1; nCount++)
    {
         digitoCPF = Integer.valueOf (strCpf.substring(nCount -1, nCount)).intValue();

        //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.
        d1 = d1 + ( 11 - nCount ) * digitoCPF;
        
        //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.
        d2 = d2 + ( 12 - nCount ) * 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 = strCpf.substring (strCpf.length()-2, strCpf.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);
    }
}

}[/code]

Pronto… se os digitos forem iguais…ele retorna false e consequentemente Digito inválido!

Valew, foi falar isso p/ o cliente. Mas se ele quiser, fazer oq neh. Porque eu acha que tambem era valido, pois o algoritmo de verificação é da receita, e se aprova.

[quote] for (int i = strCpf.length(); i >= 0; i--) { //verifica é o CPF ao contrario verifica = verifica + strCpf.charAt(i); } if (verifica.equals(strCpf)) { //Se o CPF ao contrario é igual o normal...os digitos são iguais... return false; } [/quote]

Achei muito interessante isso que foi fez, para verificar se os numeros são iguais, porem não funcionar em 100% dos casos, o numero 123454321 não é um numero com todos caracteres iguais e passa nessa verificação.

Mas consegui fazer com regex. Obrigado a todos que me ajudaram. Segue o código para ficar registrado no forum e futuramente ser usado.

    java.util.regex.Pattern p = java.util.regex.Pattern.compile(suaString.charAt(0)+"{"+suaString.length()+"}"); 
    java.util.regex.Matcher m = p.matcher(suaString); 
    if(m.find()) System.out.println("Todos os caracteres são iguais!!!");

Valew galera.
t+

É verdade…agora que vc disse que eu percebi…

for (int i = 0; strCpf.charAt(i) != strCpf.charAt(i + 1), i < strCpf.length() - 1; i++) { if (i != strCpf.length()) { verifica = true; } }

Não sei pq tá com erro aqui…mas…

[code]for (int i = 0; strCpf.charAt(i) != strCpf.charAt(i + 1), i < strCpf.length() - 1; i++) {
if (i != strCpf.length()) {
verifica = true;
}
}

  if (!verifica) {
      return false;
  }
  else {//...[/code]

Faz isso e testa…ele vai comparar char por char…se no fim…o i == strCpf.length() (ou seja…ele chegou no fim e não achou diferente…)…ele retorna false…digito invalido…se ele não chegou no fim…ele faz os calculos…

Eu acho que funciona…testa ae e concerta ali em cima…

Depois de ninguém ter entendido a sua pergunta vc mesmo resolveu. :lol:
Obrigado, eu tinha a mesma duvida.

Ainda acho melhor verificar se é válido, ao invés do contrário! :slight_smile:

Ps.: ps desculpa desenterrar esse post antigo, mais é apenas para dar uma informação + precisa.

Apenas respondendo, dos CPFs com números iguais apenas o 000.000.000-00 passa pela validação do digito verificador, porém a propria receita federal informa que este CPF não é valido

Segue documentação: http://www.receita.fazenda.gov.br/publico/Legislacao/atos/AtosConjuntos/AnexoIADEConjuntoCoratCotec0012002.doc

todos os CPF iguais são invalidos, e nem passam pela validação dos digitos verificadores, isso é tanto verdade que os CPF 111.111.111-11 e 888.888.888-88 estão em situação cadastral CANCELADA…

caso alguem precise validar um CPF basta calcular o digito verificador correto, e fazer a conta abaixo, e ver c ele bate com os digitos do CPF informado.

cpfInformado.subString(8,11).equals(digitValidator(cpfInformado)) //com esse teste vc pode validar o CPF, seque apenas um trecho da minha classe

/* Regra para validação de cpf:
 * 
 * Os digitos verificadores são formados por 2 digitos XY, calculados da seguinte 
 * forma
 * 
 * 1° digito verificador (X): somar o valor da multiplicação dos 9 primeiros digitos
 * do cpf por 10,9,8,7,6,5,4,3,2 (cpf[0]*10 + cpf[1]*9 + ... + cpf[8]*2). Depois
 * pegar o resto da divisão desta soma por 11. Verificar se o resto da divisão é
 * menor ou igual a 1, e neste caso o digito verificador será 0, caso contrario o
 * digito verificador será 11 subtraido do resto da divisão da soma por 11 
 * (11 - soma%11).
 * 
 * 1° digito verificador (Y): somar o valor da multiplicação dos 9 primeiros digitos
 * do cpf por 10,9,8,7,6,5,4,3,2 (cpf[0]*10 + cpf[1]*9 + ... + cpf[8]*2). Depois
 * pegar o resto da divisão desta soma por 11. Verificar se o resto da divisão é
 * menor ou igual a 1, e neste caso o digito verificador será 0, caso contrario o 
 * digito verificador será 11 subtraido do resto da divisão da soma por 11 
 * (11 - soma%11).
 */
public static String digitValidator(String cpf) {
	char[] cpfChars =  cpf.toCharArray();
	int firstDigitSum = 0; 
	int secondDigitSum = 0;
	for (int i = 0; i<9; i++) {
		firstDigitSum += (10-i) * Character.getNumericValue(cpfChars[i]);
		secondDigitSum += (11-i) * Character.getNumericValue(cpfChars[i]);
	}
	//firstDigitSum%11 é o mesmo que "Resto da divisão de firstDigitSum por 11"
	int  digit1 = ((firstDigitSum % 11) > 1) ? 11 - (firstDigitSum % 11) : 0;
	int  digit2 = ((secondDigitSum % 11) > 1) ? 11- (secondDigitSum % 11) : 0;
	return "" + digit1 + digit2;
}

Somente como ressalva:
Deve-se considerar INVÁLIDO o CPF que contenha todos os dígitos iguais.

[quote=marcobiscaro2112]Somente como ressalva:
Deve-se considerar INVÁLIDO o CPF que contenha todos os dígitos iguais.[/quote]

se vc validar o digito verificador, vai ver que nenhum CPF com todos os números iguais é valido (salvo o 000.000.000-00 que o digito verificador é valido)

//