Validação de CPF

Java

09/04/2009

/* ******************************************************
  * Código Original:
  * Autor: Allan Peron
  * ******************************************************
  * Modificações feitas para fácil aplicação
*/

package br.com.javafree.wscpf;

public abstract class CPF extends Object {

    private static String calcDigVerif(String num) {
        Integer primDig, segDig;
        int soma = 0, peso = 10;
        for (int i = 0; i < num.length(); i++)
                soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;

        if (soma % 11 == 0 | soma % 11 == 1)
            primDig = new Integer(0);
        else
            primDig = new Integer(11 - (soma % 11));

        soma = 0;
        peso = 11;
        for (int i = 0; i < num.length(); i++)
                soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;
        
        soma += primDig.intValue() * 2;
        if (soma % 11 == 0 | soma % 11 == 1)
            segDig = new Integer(0);
        else
            segDig = new Integer(11 - (soma % 11));

        return primDig.toString() + segDig.toString();
    }

    private static int calcSegDig(String cpf, int primDig) {
        int soma = 0, peso = 11;
        for (int i = 0; i < cpf.length(); i++)
                soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;
        
        soma += primDig * 2;
        if (soma % 11 == 0 | soma % 11 == 1)
            return 0;
        else
            return 11 - (soma % 11);
    }

    public static String geraCPF() {
        String iniciais = "";
        Integer numero;
        for (int i = 0; i < 9; i++) {
            numero = new Integer((int) (Math.random() * 10));
            iniciais += numero.toString();
        }
        return iniciais + calcDigVerif(iniciais);
    }

    public static boolean validaCPF(String cpf) {
        if (cpf.length() != 11)
            return false;

        String numDig = cpf.substring(0, 9);
        return calcDigVerif(numDig).equals(cpf.substring(9, 11));
    }
}

Dalton

Dalton

Curtidas 0

Respostas

Luis Carvalho

Luis Carvalho

09/04/2009

Dalton, Desculpe minha ignoräncia, mas porque o "package..."? Sds
GOSTEI 0
Dalton

Dalton

09/04/2009

[quote="carvalho4"]Dalton, Desculpe minha ignoräncia, mas porque o "package..."? Sds
Bom, essa é uma dúvida super básica sobre java.. Acredito que seja melhor você dar uma lida neste tópico: http://www.javafree.org/javabb/viewtopic.jbb?t=850964 See ya!
GOSTEI 0
Renan Ribeiro

Renan Ribeiro

09/04/2009

Ola.. só não entendi pra q serve o metodo de gerar um cpf?? A verificação não será aplicada a um cpf pré existente? desde já agradeço.
GOSTEI 0
Victor Lindberg

Victor Lindberg

09/04/2009

Dá uma olhada nesse framework, www.lindbergframework.org É um framework que faz exatamente o que você está procurando. Este framework não é exclusivo de validações brasileiras não. Com ele você pode fazer qualquer tipo de validação, pode criar as suas próprias, mesclar várias validações para compor uma outra validação e mais, o framework lhe dá suporte a annotations também o que faz com que vc possa configurar suas validações em seus beans utilizando annotations. Mesmo as validações que o framework já oferece como CNPJ, CPF, DATAS, VALORES, COMPARAÇÕES DE OBJETOS, ETC... bem como as suas validações criadas tb podem ser usadas com as annotations do framework. Esse framework trabalha com o spring (mas não lhe obriga a usa-lo tb) criando um contexto de beans de validações. O framework é extensível e seu uso customizável. VAle a pena dá uma olhada. O site mais uma vez: www.lindbergframework.org FLw
GOSTEI 0
Victor Lindberg

Victor Lindberg

09/04/2009

Ae galera eu criei uma classe que calcula cnpj e cpf, que retorna true ou false, se alguem achar algum erro me retorne, pois comessei a pouco tempo a programar em java, segue logo abaixo o código:
public class Validacao {

    public boolean calculaCPF(String cpfNum) {
        int[] cpf = new int[cpfNum.length()]; //define o valor com o tamanho da string
        int resultP = 0;
        int resultS = 0;

        //converte a string para um array de integer
        for (int i = 0; i < cpf.length; i++) {
            cpf[i] = Integer.parseInt(cpfNum.substring(i, i + 1));
        }

        //calcula o primeiro número(DIV) do cpf
        for (int i = 0; i < 9; i++) {
            resultP += cpf[i] * (i + 1);
        }
        int divP = resultP % 11;

        //se o resultado for diferente ao 10º digito do cpf retorna falso
        if (divP != cpf[9]) {
            return false;
        } else {
            //calcula o segundo número(DIV) do cpf
            for (int i = 0; i < 10; i++) {
                resultS += cpf[i] * (i);
            }
            int divS = resultS % 11;

            //se o resultado for diferente ao 11º digito do cpf retorna falso
            if (divS != cpf[10]) {
                return false;
            }
        }

        //se tudo estiver ok retorna verdadeiro
        return true;
    }//fim do calcular cpf ==================================================

    public boolean calculaCNPJ(String cnpjNum) {
        int[] cnpj = new int[cnpjNum.length()];
        int resultP = 0;
        int resultS = 0;
        int divP = 0;
        int divS = 0;

        //converte string para um array de integer
        for (int i = 0; i < cnpjNum.length(); i++) {
            cnpj[i] = Integer.parseInt(cnpjNum.substring(i, i + 1));
        }

        int j = 6;
        //calcula o primeiro div
        for (int i = 0; i < 12; i++) {
            resultP += cnpj[i] * j;

            j++;
            if (j > 9) {
                j = 2;
            }
        }
        divP = resultP % 11;

        if (divP != cnpj[12]) {
            return false;
        } else {
            j = 5;
            //calcula o segundo div 
            for (int i = 0; i < 13; i++) {
                resultS += cnpj[i] * j;

                j++;
                if (j > 9) {
                    j = 2;
                }
            }
            divS = resultS % 11;

            if (divS != cnpj[13])
                return false;
        }
        return true;
    }//fim do calcular CNPJ ==================================================
}

GOSTEI 0
Victor Lindberg

Victor Lindberg

09/04/2009

Diego, vc só esqueceu de especificar que este método é enviado como "String" sem formatação ( ponto , hífen, barra )Ex: 000.000.000-00 ou no cnpj que tem /0000 Mesmo assim bom trabalho :mrgreen: [quote="diegomh"]Ae galera eu criei uma classe que calcula cnpj e cpf, que retorna true ou false, se alguem achar algum erro me retorne, pois comessei a pouco tempo a programar em java, segue logo abaixo o código:
public class Validacao {

    public boolean calculaCPF(String cpfNum) {
        int[] cpf = new int[cpfNum.length()]; //define o valor com o tamanho da string
        int resultP = 0;
        int resultS = 0;

        //converte a string para um array de integer
        for (int i = 0; i < cpf.length; i++) {
            cpf[i] = Integer.parseInt(cpfNum.substring(i, i + 1));
        }

        //calcula o primeiro número(DIV) do cpf
        for (int i = 0; i < 9; i++) {
            resultP += cpf[i] * (i + 1);
        }
        int divP = resultP % 11;

        //se o resultado for diferente ao 10º digito do cpf retorna falso
        if (divP != cpf[9]) {
            return false;
        } else {
            //calcula o segundo número(DIV) do cpf
            for (int i = 0; i < 10; i++) {
                resultS += cpf[i] * (i);
            }
            int divS = resultS % 11;

            //se o resultado for diferente ao 11º digito do cpf retorna falso
            if (divS != cpf[10]) {
                return false;
            }
        }

        //se tudo estiver ok retorna verdadeiro
        return true;
    }//fim do calcular cpf ==================================================

    public boolean calculaCNPJ(String cnpjNum) {
        int[] cnpj = new int[cnpjNum.length()];
        int resultP = 0;
        int resultS = 0;
        int divP = 0;
        int divS = 0;

        //converte string para um array de integer
        for (int i = 0; i < cnpjNum.length(); i++) {
            cnpj[i] = Integer.parseInt(cnpjNum.substring(i, i + 1));
        }

        int j = 6;
        //calcula o primeiro div
        for (int i = 0; i < 12; i++) {
            resultP += cnpj[i] * j;

            j++;
            if (j > 9) {
                j = 2;
            }
        }
        divP = resultP % 11;

        if (divP != cnpj[12]) {
            return false;
        } else {
            j = 5;
            //calcula o segundo div 
            for (int i = 0; i < 13; i++) {
                resultS += cnpj[i] * j;

                j++;
                if (j > 9) {
                    j = 2;
                }
            }
            divS = resultS % 11;

            if (divS != cnpj[13])
                return false;
        }
        return true;
    }//fim do calcular CNPJ ==================================================
}

GOSTEI 0
Bruno Viana

Bruno Viana

09/04/2009

[quote="lindberg713"]Dá uma olhada nesse framework, www.lindbergframework.org É um framework que faz exatamente o que você está procurando. Este framework não é exclusivo de validações brasileiras não. Com ele você pode fazer qualquer tipo de validação, pode criar as suas próprias, mesclar várias validações para compor uma outra validação e mais, o framework lhe dá suporte a annotations também o que faz com que vc possa configurar suas validações em seus beans utilizando annotations. Mesmo as validações que o framework já oferece como CNPJ, CPF, DATAS, VALORES, COMPARAÇÕES DE OBJETOS, ETC... bem como as suas validações criadas tb podem ser usadas com as annotations do framework. Esse framework trabalha com o spring (mas não lhe obriga a usa-lo tb) criando um contexto de beans de validações. O framework é extensível e seu uso customizável. VAle a pena dá uma olhada. O site mais uma vez: www.lindbergframework.org FLw
Qual é o tipo de licença dessa framework?
GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

[quote="fabiaum"]Diego, vc só esqueceu de especificar que este método é enviado como "String" sem formatação ( ponto , hífen, barra )Ex: 000.000.000-00 ou no cnpj que tem /0000 Mesmo assim bom trabalho :mrgreen: [quote="diegomh"]Ae galera eu criei uma classe que calcula cnpj e cpf, que retorna true ou false, se alguem achar algum erro me retorne, pois comessei a pouco tempo a programar em java, segue logo abaixo o código:
public class Validacao {

    public boolean calculaCPF(String cpfNum) {
        int[] cpf = new int[cpfNum.length()]; //define o valor com o tamanho da string
        int resultP = 0;
        int resultS = 0;

        //converte a string para um array de integer
        for (int i = 0; i < cpf.length; i++) {
            cpf[i] = Integer.parseInt(cpfNum.substring(i, i + 1));
        }

        //calcula o primeiro número(DIV) do cpf
        for (int i = 0; i < 9; i++) {
            resultP += cpf[i] * (i + 1);
        }
        int divP = resultP % 11;

        //se o resultado for diferente ao 10º digito do cpf retorna falso
        if (divP != cpf[9]) {
            return false;
        } else {
            //calcula o segundo número(DIV) do cpf
            for (int i = 0; i < 10; i++) {
                resultS += cpf[i] * (i);
            }
            int divS = resultS % 11;

            //se o resultado for diferente ao 11º digito do cpf retorna falso
            if (divS != cpf[10]) {
                return false;
            }
        }

        //se tudo estiver ok retorna verdadeiro
        return true;
    }//fim do calcular cpf ==================================================

    public boolean calculaCNPJ(String cnpjNum) {
        int[] cnpj = new int[cnpjNum.length()];
        int resultP = 0;
        int resultS = 0;
        int divP = 0;
        int divS = 0;

        //converte string para um array de integer
        for (int i = 0; i < cnpjNum.length(); i++) {
            cnpj[i] = Integer.parseInt(cnpjNum.substring(i, i + 1));
        }

        int j = 6;
        //calcula o primeiro div
        for (int i = 0; i < 12; i++) {
            resultP += cnpj[i] * j;

            j++;
            if (j > 9) {
                j = 2;
            }
        }
        divP = resultP % 11;

        if (divP != cnpj[12]) {
            return false;
        } else {
            j = 5;
            //calcula o segundo div 
            for (int i = 0; i < 13; i++) {
                resultS += cnpj[i] * j;

                j++;
                if (j > 9) {
                    j = 2;
                }
            }
            divS = resultS % 11;

            if (divS != cnpj[13])
                return false;
        }
        return true;
    }//fim do calcular CNPJ ==================================================
}

Esse código não é válido! Há vários CPFs válidos que são indentificados como Inválidos por essa Classe.
GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

[quote="BLV-DOOM JAVA"][quote="lindberg713"]Dá uma olhada nesse framework, www.lindbergframework.org É um framework que faz exatamente o que você está procurando. Este framework não é exclusivo de validações brasileiras não. Com ele você pode fazer qualquer tipo de validação, pode criar as suas próprias, mesclar várias validações para compor uma outra validação e mais, o framework lhe dá suporte a annotations também o que faz com que vc possa configurar suas validações em seus beans utilizando annotations. Mesmo as validações que o framework já oferece como CNPJ, CPF, DATAS, VALORES, COMPARAÇÕES DE OBJETOS, ETC... bem como as suas validações criadas tb podem ser usadas com as annotations do framework. Esse framework trabalha com o spring (mas não lhe obriga a usa-lo tb) criando um contexto de beans de validações. O framework é extensível e seu uso customizável. VAle a pena dá uma olhada. O site mais uma vez: www.lindbergframework.org FLw
Qual é o tipo de licença dessa framework?
Opa, desculpa a demora em responder. Só vi agora. A licença é a GNU GPL v3.
GOSTEI 0
Victor Lindberg

Victor Lindberg

09/04/2009

[quote="andersonneto"] Esse código não é válido! Há vários CPFs válidos que são indentificados como Inválidos por essa Classe.
exemplo?
GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

[quote="sekkuar"][quote="andersonneto"] Esse código não é válido! Há vários CPFs válidos que são indentificados como Inválidos por essa Classe.
exemplo?
[REDACTED] 604.771.052-20 [REDACTED]
GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

[quote="andersonneto"][quote="sekkuar"][quote="andersonneto"] Esse código não é válido! Há vários CPFs válidos que são indentificados como Inválidos por essa Classe.
exemplo?
[REDACTED] 604.771.052-20 [REDACTED] é tem razão, este código não valida direito http://ideone.com/Iu0jF
GOSTEI 0
Douglas Eric

Douglas Eric

09/04/2009

[quote="andersonneto"][quote="sekkuar"][quote="andersonneto"] Esse código não é válido! Há vários CPFs válidos que são indentificados como Inválidos por essa Classe.
exemplo?
[REDACTED] 604.771.052-20 [REDACTED] [CONTEÚDO REMOVIDO POR SUSPEITA DE PROPAGANDA]
GOSTEI 0
Douglas Eric

Douglas Eric

09/04/2009

[quote="lindberg713"]....
Isso está me cheirando a propaganda. Tudo bem, você quer ajudar, e divulgar seu framework, mas você já postou nesse tópico uma vez, não fique batendo na mesma tecla. Se quiser, pode editar o seu post anterior para incluir novas informações, mas por favor, não poste de novo a mesma coisa! até porque, já está perdendo o foco *deste* tópico, que é comentar no artigo enviado e que funciona muito bem http://ideone.com/SsLiZ sendo assim, por favor edite ou apague o seu post. Você é bem vindo a escrever seu próprio artigo ensinando a usar seu framework, mas não faça propaganda dele nos comentários de outro artigo.
GOSTEI 0
Douglas Eric

Douglas Eric

09/04/2009

Nao estou fazendo propaganda. Nao ganho nada com isso. So postei algo que poderia ajudar na questão, mostando uma outra forma de se fazer e que efetua a validação corretamente que vcs estao discutindo que nao esta funcionando. Se acha que nao agrega tudo bem. Desconsidere e nao leia. Nao perde o foco em nada, se o assunto é validação de cpf eu tratei exatamente sobre isso. Quem quiser fazer uso faz quem nao quiser nao faz. Nao ganho nada com propaganda, apenas estou tentando ajudar. Mas a partir deste momento me abstenho deste topico! Fique brincando entao de tentar escrever uma validação correta.
GOSTEI 0
Victor Lindberg

Victor Lindberg

09/04/2009

Pra esse tipo de situação costumo usar o projeto http://stella.caelum.com.br/ desenvolvido pelo pessoal da Caelum. Até o momento me serviu muito bem. Não trabalho na Caelum, infelizmente. :P Esse negócio de validação de CPF/CNPJ já deve utilizar uma API padrão em vez de códigos escritos em tutoriais. Os tutoriais devem servir somente para entender a validação. Minha opinião.
GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

Segue o código de Validação de CPF, de acordos com os princípios da receita federal.
/*
 * IFPA - Instituto Federal de Educação, Ciência e Tecnologia do Pará - Pólo de Tucumã
 * Tecnologia de Análise e Desenvolvimento de Sistemas
 * TAC - Trabalho Acadêmico de Conclusão
 */


/**
 * @author Anderson Marques Neto
 * Matrícula: 200879217 - Turma: C791UE (A) - E-mail: andersonneto@msn.com
 */
public class ValidarCPF {

    /** Realiza a validação do CPF.
     *
     * @param   strCPF número de CPF a ser validado
     * @return  true se o CPF é válido e false se não é válido
     */
    public boolean CPF(String strCpf) {
        if (strCpf.equals("")) {
            return false;
        }
        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);
    }
    /* Use este trecho para testar a classe
    public static void main(String[] args) {
    System.out.println( CPF("04624193806") );
    }
     */
}

GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

[quote="lindberg713"]Nao estou fazendo propaganda. Nao ganho nada com isso. So postei algo que poderia ajudar na questão, mostando uma outra forma de se fazer e que efetua a validação corretamente que vcs estao discutindo que nao esta funcionando. Se acha que nao agrega tudo bem. Desconsidere e nao leia. Nao perde o foco em nada, se o assunto é validação de cpf eu tratei exatamente sobre isso. Quem quiser fazer uso faz quem nao quiser nao faz. Nao ganho nada com propaganda, apenas estou tentando ajudar. Mas a partir deste momento me abstenho deste topico! Fique brincando entao de tentar escrever uma validação correta.
Concordo com voce Lindberg. Frameworks estão aí pra isso. Poxa, se voce criou um framework bacana, ainda por cima em portugues, não vejo nenhum problema em publicar ele no fórum. Muito pelo contrário, até porque ele resolve a necessidade da pessoa que pediu ajuda. De vez em quando eu mesmo publico frameworks ou utilitarios que faço e até hoje ninguém reclamou. Exemplos: [url="http://javafree.uol.com.br/viewtopic.jbb?t=882437&page=1&Framework-para-Regras-de-Negocio.html"]Framework para Regras de Negócio Reutilizáveis[/url] [url="http://javafree.uol.com.br/artigo/875226/Classe-utilitaria-para-compactacao-e-descompactacao-de-arqui.html"]Utilitário para Compactação e Descompactação[/url]
GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

[quote="staroski"][quote="lindberg713"]Nao estou fazendo propaganda. Nao ganho nada com isso. So postei algo que poderia ajudar na questão, mostando uma outra forma de se fazer e que efetua a validação corretamente que vcs estao discutindo que nao esta funcionando. Se acha que nao agrega tudo bem. Desconsidere e nao leia. Nao perde o foco em nada, se o assunto é validação de cpf eu tratei exatamente sobre isso. Quem quiser fazer uso faz quem nao quiser nao faz. Nao ganho nada com propaganda, apenas estou tentando ajudar. Mas a partir deste momento me abstenho deste topico! Fique brincando entao de tentar escrever uma validação correta.
Concordo com voce Lindberg. Frameworks estão aí pra isso. Poxa, se voce criou um framework bacana, ainda por cima em portugues, não vejo nenhum problema em publicar ele no fórum. Muito pelo contrário, até porque ele resolve a necessidade da pessoa que pediu ajuda. De vez em quando eu mesmo publico frameworks ou utilitarios que faço e até hoje ninguém reclamou. Exemplos: [url="http://javafree.uol.com.br/viewtopic.jbb?t=882437&page=1&Framework-para-Regras-de-Negocio.html"]Framework para Regras de Negócio Reutilizáveis[/url] [url="http://javafree.uol.com.br/artigo/875226/Classe-utilitaria-para-compactacao-e-descompactacao-de-arqui.html"]Utilitário para Compactação e Descompactação[/url]
Pois é parceiro. Somos uma comunidade e estamos aqui para ajudar. Se desenvolvemos algo que julgamos que pode agregar e ajudar alguem assim o fazemos. Com certeza vc não ganha nada publicando essas suas soluções a não ser o prazer de ajudar e contribuir com a comunidade. Da mesma forma eu penso. Obrigado pela sua resposta.
GOSTEI 0
Anderson Neto

Anderson Neto

09/04/2009

que fim levou esse tópico? o código de validação do Anderson esta certo? sou novato e não entendi muito bem o código, acho que não resolve a questão do 111111111-11 resolve? achei esse código na net e queria saber se esta correto!


public class ValidaCPF {
  
  public static boolean isCPF(String CPF) {
// considera-se erro CPF's formados por uma sequencia de numeros iguais
    if (CPF.equals("00000000000") || CPF.equals("11111111111") ||
        CPF.equals("22222222222") || CPF.equals("33333333333") ||
        CPF.equals("44444444444") || CPF.equals("55555555555") ||
        CPF.equals("66666666666") || CPF.equals("77777777777") ||
        CPF.equals("88888888888") || CPF.equals("99999999999") ||
       (CPF.length() != 11))
       return(false);
 
    char dig10, dig11;
    int sm, i, r, num, peso;
 
// "try" - protege o codigo para eventuais erros de conversao de tipo (int)
    try {
// Calculo do 1o. Digito Verificador
      sm = 0;
      peso = 10;
      for (i=0; i<9; i++) {              
// converte o i-esimo caractere do CPF em um numero:
// por exemplo, transforma o caractere '0' no inteiro 0         
// (48 eh a posicao de '0' na tabela ASCII)         
        num = (int)(CPF.charAt(i) - 48); 
        sm = sm + (num * peso);
        peso = peso - 1;
      }
 
      r = 11 - (sm % 11);
      if ((r == 10) || (r == 11))
         dig10 = '0';
      else dig10 = (char)(r + 48); // converte no respectivo caractere numerico
 
// Calculo do 2o. Digito Verificador
      sm = 0;
      peso = 11;
      for(i=0; i<10; i++) {
        num = (int)(CPF.charAt(i) - 48);
        sm = sm + (num * peso);
        peso = peso - 1;
      }
 
      r = 11 - (sm % 11);
      if ((r == 10) || (r == 11))
         dig11 = '0';
      else dig11 = (char)(r + 48);
 
// Verifica se os digitos calculados conferem com os digitos informados.
      if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10)))
         return(true);
      else return(false);
    } catch (InputMismatchException erro) {
        return(false);
    }
  }
 
  public static String imprimeCPF(String CPF) {
    return(CPF.substring(0, 3) + "." + CPF.substring(3, 6) + "." +
      CPF.substring(6, 9) + "-" + CPF.substring(9, 11));
  }
}
é isso mesmo?
GOSTEI 0
Douglas Eric

Douglas Eric

09/04/2009

[quote="vitorPinel"]que fim levou esse tópico? o código de validação do Anderson esta certo? sou novato e não entendi muito bem o código, acho que não resolve a questão do 111111111-11 resolve? achei esse código na net e queria saber se esta correto! é isso mesmo?
O código do artigo está certo. Os outros são duvidosos use por conta e risco.
GOSTEI 0
Douglas Eric

Douglas Eric

09/04/2009

[quote="sekkuar"][quote="vitorPinel"]que fim levou esse tópico? o código de validação do Anderson esta certo? sou novato e não entendi muito bem o código, acho que não resolve a questão do 111111111-11 resolve? achei esse código na net e queria saber se esta correto! é isso mesmo?
O código do artigo está certo. Os outros são duvidosos use por conta e risco.
Sek não entendi muito bem o código do artigo!!! qual o método que chamo pra validar o CPF pois pelo entendi o método valida CPF verifica se tem 11 dígitos e depois? ele só compara o valor dos dígitos e retorna falso ou verdadeiro? é isso mesmo? e a questão 111111111-11 e etc?
GOSTEI 0
Lucas Iorio

Lucas Iorio

09/04/2009

[quote="vitorPinel"]que fim levou esse tópico? o código de validação do Anderson esta certo? sou novato e não entendi muito bem o código, acho que não resolve a questão do 111111111-11 resolve? achei esse código na net e queria saber se esta correto!


public class ValidaCPF {
  
  public static boolean isCPF(String CPF) {
// considera-se erro CPF's formados por uma sequencia de numeros iguais
    if (CPF.equals("00000000000") || CPF.equals("11111111111") ||
        CPF.equals("22222222222") || CPF.equals("33333333333") ||
        CPF.equals("44444444444") || CPF.equals("55555555555") ||
        CPF.equals("66666666666") || CPF.equals("77777777777") ||
        CPF.equals("88888888888") || CPF.equals("99999999999") ||
       (CPF.length() != 11))
       return(false);
 
    char dig10, dig11;
    int sm, i, r, num, peso;
 
// "try" - protege o codigo para eventuais erros de conversao de tipo (int)
    try {
// Calculo do 1o. Digito Verificador
      sm = 0;
      peso = 10;
      for (i=0; i<9; i++) {              
// converte o i-esimo caractere do CPF em um numero:
// por exemplo, transforma o caractere '0' no inteiro 0         
// (48 eh a posicao de '0' na tabela ASCII)         
        num = (int)(CPF.charAt(i) - 48); 
        sm = sm + (num * peso);
        peso = peso - 1;
      }
 
      r = 11 - (sm % 11);
      if ((r == 10) || (r == 11))
         dig10 = '0';
      else dig10 = (char)(r + 48); // converte no respectivo caractere numerico
 
// Calculo do 2o. Digito Verificador
      sm = 0;
      peso = 11;
      for(i=0; i<10; i++) {
        num = (int)(CPF.charAt(i) - 48);
        sm = sm + (num * peso);
        peso = peso - 1;
      }
 
      r = 11 - (sm % 11);
      if ((r == 10) || (r == 11))
         dig11 = '0';
      else dig11 = (char)(r + 48);
 
// Verifica se os digitos calculados conferem com os digitos informados.
      if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10)))
         return(true);
      else return(false);
    } catch (InputMismatchException erro) {
        return(false);
    }
  }
 
  public static String imprimeCPF(String CPF) {
    return(CPF.substring(0, 3) + "." + CPF.substring(3, 6) + "." +
      CPF.substring(6, 9) + "-" + CPF.substring(9, 11));
  }
}
é isso mesmo?
Olhando como funciona o cálculo do CPF http://www.gerardocumentos.com.br/?pg=entenda-a-formula-do-cpf "Olhando por cima" o código parece estar certo, não compilei para verificar se existe algum outro erro. Fiz no papel com o cpf 11111111111 , e realmente passaria, pela formula citada nessa página, isso deve ser tratado a parte. Recomendo que faça uma bateria de testes para tirar sua dúvida. Se souber usar o JUnit vai ser tranquilo. Todo método importante em seu sistema deve ter um Junit que seja rodado antes da geração do pacote, para evitar que alguém estrague tudo hehe =)
GOSTEI 0
Lucas Iorio

Lucas Iorio

09/04/2009

[quote="diegomh"]Ae galera eu criei uma classe que calcula cnpj e cpf, que retorna true ou false, se alguem achar algum erro me retorne, pois comessei a pouco tempo a programar em java, segue logo abaixo o código:
public class Validacao {

    public boolean calculaCPF(String cpfNum) {
        int[] cpf = new int[cpfNum.length()]; //define o valor com o tamanho da string
        int resultP = 0;
        int resultS = 0;

        //converte a string para um array de integer
        for (int i = 0; i < cpf.length; i++) {
            cpf[i] = Integer.parseInt(cpfNum.substring(i, i + 1));
        }

        //calcula o primeiro número(DIV) do cpf
        for (int i = 0; i < 9; i++) {
            resultP += cpf[i] * (i + 1);
        }
        int divP = resultP % 11;

        //se o resultado for diferente ao 10º digito do cpf retorna falso
        if (divP != cpf[9]) {
            return false;
        } else {
            //calcula o segundo número(DIV) do cpf
            for (int i = 0; i < 10; i++) {
                resultS += cpf[i] * (i);
            }
            int divS = resultS % 11;

            //se o resultado for diferente ao 11º digito do cpf retorna falso
            if (divS != cpf[10]) {
                return false;
            }
        }

        //se tudo estiver ok retorna verdadeiro
        return true;
    }//fim do calcular cpf ==================================================

    public boolean calculaCNPJ(String cnpjNum) {
        int[] cnpj = new int[cnpjNum.length()];
        int resultP = 0;
        int resultS = 0;
        int divP = 0;
        int divS = 0;

        //converte string para um array de integer
        for (int i = 0; i < cnpjNum.length(); i++) {
            cnpj[i] = Integer.parseInt(cnpjNum.substring(i, i + 1));
        }

        int j = 6;
        //calcula o primeiro div
        for (int i = 0; i < 12; i++) {
            resultP += cnpj[i] * j;

            j++;
            if (j > 9) {
                j = 2;
            }
        }
        divP = resultP % 11;

        if (divP != cnpj[12]) {
            return false;
        } else {
            j = 5;
            //calcula o segundo div 
            for (int i = 0; i < 13; i++) {
                resultS += cnpj[i] * j;

                j++;
                if (j > 9) {
                    j = 2;
                }
            }
            divS = resultS % 11;

            if (divS != cnpj[13])
                return false;
        }
        return true;
    }//fim do calcular CNPJ ==================================================
}

Não testei seu código diego, mas caso o Resto seja menor que 2, o digito seria Zero e no seu caso não tem esse tratamento
 int divP = resultP % 11; 
GOSTEI 0
Lucas Iorio

Lucas Iorio

09/04/2009

alguem pode mi ajudar nesse algoritmo? Proponha e implemente em Java abstrações de dados que comtemplem às seguintes premissas: Sistema de controle acadêmico Estrutura de Dados Uma Pessoa possui Nome e CPF Um Aluno é uma Pessoa que possui inúmeras notas Um Professor é uma Pessoa que possui salário Uma Disciplina possui apenas um professor associado e vários alunos Uma Turma possui vários alunos Uma série possui várias turmas Relatórios Boletim Alunos por Turma Média de Notas por Turma / Disciplina
GOSTEI 0
Lucas Iorio

Lucas Iorio

09/04/2009

[quote="halde"]alguem pode mi ajudar nesse algoritmo? Proponha e implemente em Java abstrações de dados que comtemplem às seguintes premissas: Sistema de controle acadêmico Estrutura de Dados Uma Pessoa possui Nome e CPF Um Aluno é uma Pessoa que possui inúmeras notas Um Professor é uma Pessoa que possui salário Uma Disciplina possui apenas um professor associado e vários alunos Uma Turma possui vários alunos Uma série possui várias turmas Relatórios Boletim Alunos por Turma Média de Notas por Turma / Disciplina
Isso é trabalho de faculdade que você ta postando pra que o pessoal responda e faça para você. Vá estudar, ler material, quebrar a cabeça, aprender e fazer por si só. Isso vai diferenciar os homens dos meninos quando você for trabalhar na vida real no mercado de trabalho. Se não tem as cara pra aprender java, vá ser designer ou "fazedor" de site de 150 reais em PHP. A comunidade java não precisa de pessoas como você.
GOSTEI 0
POSTAR