GARANTIR DESCONTO

Fórum Validação de CNH #372972

31/07/2009

0

Olá! Estou reenviando a dúvida escrita de uma outra maneira, pois o assunto ´parou´ no post anterior...

Preciso de um algoritmo que valide carteiras de motorista (em qualquer linguagem). O algoritmo apresentado aqui anteriormente pelo membro ´cps.art´ (no post http://forum.devmedia.com.br/viewtopic.php?p=331498&sid=dca79e46564c9d75e19fff65e14b1393) é muito bom, e valida quase todos os números que testei.

Porém ainda não valida 100¬ das CNHs. Num laço de repetição que testei uma massa de 3123 números de CNH, apenas 71 não validaram através da última função apresentada aqui. Porém estas 71 são CNHs válidas, como pode ser verificado em sites do DETRAN.

Exemplos de CNHs válidas (que não validaram com essa função) são:

416345009
697159700
709245709
715334009
804310709
894476709

e

01137369409
01217567509
01417566409
01422691909

Para conseguir a lista com as 3123 CNHs, basta acessar
http://www.detran.rj.gov.br/_monta_aplicacoes.asp?doc=5646&cod=14&tipo=exibe_noticias&pag_noticias=true

E para testar o dígito verificador oficialmente pelo Detran, podemos usar o link https://wwws.detrannet.mg.gov.br/detran/pontuacond.asp?IdServico=36

Verifiquem. Estou tentando achar qual é o erro. De qualquer maneira, o algoritmo é muito bom, e valida na grande maioria dos casos (apenas 2¬ de erro), porém meio erro ainda é um erro.

Vamos tentar achar um algoritmo que valide 100¬ dos números que passei?

Abraços a todos!


Provisorio

Provisorio

Responder

Posts

22/03/2011

Rildo Mendes

Fala, pessoal!

Criei uma classe que é uma sintese de outras solucoes. Ela testa CPF, CNPJ, RENAVAM, RENACH e PGU.

package rildolho.util;

/**
 *
 * @author rildolho
 */
public class Validador {

    //-------- Valida CPF ou CNPJ
    public static boolean cpfcnpj(String CPF_CNPJ) {
        CPF_CNPJ = desformatar(CPF_CNPJ);
        if (CPF_CNPJ.length() == 11) {
            return cpf(CPF_CNPJ);
        } else if (CPF_CNPJ.length() == 14) {
            return cnpj(CPF_CNPJ);
        }

        return false;
    }

    public static boolean cnpj(String CNPJ) {
        CNPJ = desformatar(CNPJ);
        if (CNPJ.matches("[0-9]")) {
            return false;
        }

        int acumulador = 0;
        int digito = 0;
        StringBuilder cnpj = new StringBuilder();
        char[] CNPJCharArray = CNPJ.toCharArray();

        cnpj.append(CNPJ.substring(0, 12));

        for (int i = 0; i < 4; i++) {
            if (((CNPJCharArray[i] - 48) >= 0)
                    && ((CNPJCharArray[i] - 48) <= 9)) {
                acumulador += (CNPJCharArray[i] - 48) * (6 - (i + 1));
            }
        }

        for (int i = 0; i < 8; i++) {
            if (((CNPJCharArray[i + 4] - 48) >= 0)
                    && ((CNPJCharArray[i + 4] - 48) <= 9)) {
                acumulador += (CNPJCharArray[i + 4] - 48) * (10 - (i + 1));
            }
        }

        digito = 11 - (acumulador % 11);

        cnpj.append((digito == 10 || digito == 11) ? "0" : digito);

        acumulador = 0;

        for (int i = 0; i < 5; i++) {
            if (((CNPJCharArray[i] - 48) >= 0)
                    && ((CNPJCharArray[i] - 48) <= 9)) {
                acumulador += (CNPJCharArray[i] - 48) * (7 - (i + 1));
            }
        }

        for (int i = 0; i < 8; i++) {
            if (((CNPJCharArray[i + 5] - 48) >= 0)
                    && ((CNPJCharArray[i + 5] - 48) <= 9)) {
                acumulador += (CNPJCharArray[i + 5] - 48) * (10 - (i + 1));
            }
        }

        digito = 11 - (acumulador % 11);

        cnpj.append((digito == 10 || digito == 11) ? "0" : digito);

        return cnpj.toString().equals(CNPJ);

    }

    public static boolean cpf(String CPF) throws NumberFormatException {
        CPF = desformatar(CPF);
        if (CPF.matches("[0-9]")) {
            return false;
        }
        int acumulador1 = 0;
        int acumulador2 = 0;
        int resto = 0;
        StringBuilder resultado = new StringBuilder();
        String digitoVerificadorCPF = CPF.substring((CPF.length() - 2), CPF.length());

        for (int i = 1; i < (CPF.length() - 1); i++) {
            acumulador1 += (11 - i) * Integer.valueOf(CPF.substring((i - 1), i));
            acumulador2 += (12 - i) * Integer.valueOf(CPF.substring((i - 1), i));
        }

        resto = acumulador1 % 11;

        if (resto < 2) {
            acumulador2 += 2;
            resultado.append(2);
        } else {
            acumulador2 += 2 * (11 - resto);
            resultado.append((11 - resto));
        }

        resto = acumulador2 % 11;

        if (resto < 2) {
            resultado.append(0);
        } else {
            resultado.append((11 - resto));
        }

        return resultado.toString().equals(digitoVerificadorCPF);
    }

    public static boolean renavam(String RENAVAM) {
        RENAVAM = desformatar(RENAVAM);
        if (!RENAVAM.matches("[0-9]")) {
            return false;
        }

        int acumulador = 0;
        for (int i = 0; i < 8; i++) {
            acumulador += Integer.parseInt(RENAVAM.substring(i, i + 1)) * (i + 2);
        }
        acumulador = acumulador % 11;
        int ultimoDigito = (acumulador == 10 ? 0 : acumulador);
        int digitoInformado = Integer.valueOf(RENAVAM.substring(RENAVAM.length() - 1, RENAVAM.length()));
        if (ultimoDigito == digitoInformado) {
            return true;
        }
        return false;
    }

    public static boolean renach_pgu(String CNH_PGU) {
        CNH_PGU = desformatar(CNH_PGU);
        if (CNH_PGU.length() == 9) {
            return pgu(CNH_PGU);
        } else if (CNH_PGU.length() == 11) {
            return renach(CNH_PGU);
        }

        return false;
    }

    private static boolean pgu(String PGU) {
        PGU = desformatar(PGU);
        if (!PGU.matches("[0-9]")) {
            return false;
        }

        if (PGU.equals("111111111") || PGU.equals("222222222") || PGU.equals("333333333")
                || PGU.equals("444444444") || PGU.equals("555555555") || PGU.equals("666666666")
                || PGU.equals("777777777") || PGU.equals("888888888") || PGU.equals("999999999")
                || PGU.equals("000000000")) {
            return false;
        }

        int[] fracao = new int[8];
        int acumulador = 0;
        for (int i = 0; i < 8; i++) {
            fracao[i] = (Math.abs(Integer.parseInt(PGU.substring(i, 1)))) * (10 - (i + 1));
            acumulador += Math.abs(fracao[i]);
        }

        int resto = acumulador % 11;
        int digito = 0;
        if (resto > 1) {
            digito = 11 - resto;
        }
        if (digito == Math.abs(Integer.parseInt(PGU.substring(8, 1)))) {
            return true;
        }

        return false;
    }

    private static boolean renach(String CNH) {
        CNH = desformatar(CNH);
        if (!CNH.matches("[0-9]")) {
            return false;
        }

        if (CNH.equals("11111111111") || CNH.equals("22222222222") || CNH.equals("33333333333")
                || CNH.equals("44444444444") || CNH.equals("55555555555") || CNH.equals("66666666666")
                || CNH.equals("77777777777") || CNH.equals("88888888888") || CNH.equals("99999999999")
                || CNH.equals("00000000000")) {
            return false;
        }

        int[] fracao = new int[9];
        int acumulador = 0;
        int inc = 2;
        for (int i = 0; i < 9; i++) {
            fracao[i] = (Math.abs(Integer.parseInt(CNH.substring(i, 1)))) * inc;
            acumulador += fracao[i];
            inc++;
        }

        int resto = acumulador % 11;
        int digito1 = 0;
        if (resto > 1) {
            digito1 = 11 - resto;
        }
        acumulador = digito1 * 2;
        inc = 3;
        for (int i = 0; i < 9; i++) {
            fracao[i] = (Math.abs(Integer.parseInt(CNH.substring(i, 1)))) * inc;
            acumulador += Math.abs(fracao[i]);
            inc++;
        }

        resto = acumulador % 11;
        int digito2 = 0;
        if (resto > 1) {
            digito2 = 11 - resto;
        }
        if (digito1 == Math.abs(Integer.parseInt(CNH.substring(9, 1)))
                && digito2 == Math.abs(Integer.parseInt(CNH.substring(10, 1)))) {
            return true;
        }

        return false;
    }

    private static String desformatar(String valor) {
        String str = "";
        String caracter = "";
        for (int i = 0; i < valor.length(); i++) {
            caracter = valor.substring(i, 1);
            if (ehNumero(caracter)) {
                str += caracter;
            }
        }
        return str;
    }

    private static boolean ehNumero(String caracter) {
        for (int i = 0; i <= 9; i++) {
            if (caracter.equals("" + i)) {
                return true;
            }
        }

        return false;
    }

}



Teste e me avise se funcionou.

Olá! Estou reenviando a dúvida escrita de uma outra maneira, pois o assunto ´parou´ no post anterior...

Preciso de um algoritmo que valide carteiras de motorista (em qualquer linguagem). O algoritmo apresentado aqui anteriormente pelo membro ´cps.art´ (no post http://forum.devmedia.com.br/viewtopic.php?p=331498&sid=dca79e46564c9d75e19fff65e14b1393) é muito bom, e valida quase todos os números que testei.

Porém ainda não valida 100¬ das CNHs. Num laço de repetição que testei uma massa de 3123 números de CNH, apenas 71 não validaram através da última função apresentada aqui. Porém estas 71 são CNHs válidas, como pode ser verificado em sites do DETRAN.

Exemplos de CNHs válidas (que não validaram com essa função) são:

416345009
697159700
709245709
715334009
804310709
894476709

e

01137369409
01217567509
01417566409
01422691909

Para conseguir a lista com as 3123 CNHs, basta acessar
http://www.detran.rj.gov.br/_monta_aplicacoes.asp?doc=5646&cod=14&tipo=exibe_noticias&pag_noticias=true

E para testar o dígito verificador oficialmente pelo Detran, podemos usar o link https://wwws.detrannet.mg.gov.br/detran/pontuacond.asp?IdServico=36

Verifiquem. Estou tentando achar qual é o erro. De qualquer maneira, o algoritmo é muito bom, e valida na grande maioria dos casos (apenas 2¬ de erro), porém meio erro ainda é um erro.

Vamos tentar achar um algoritmo que valide 100¬ dos números que passei?

Abraços a todos!
Responder

Gostei + 0

22/03/2011

Rildo Mendes

Infelizmente o código anterior continha erros, mas já efetuei modificações. Testem e me notifiquem sobre erros [code] package rildolho.util; /** * * @author rildolho */ public class Validador { //-------- Valida CPF ou CNPJ public static boolean cpfcnpj(String CPF_CNPJ) { CPF_CNPJ = desformatar(CPF_CNPJ); if (CPF_CNPJ.length() == 11) { return cpf(CPF_CNPJ); } else if (CPF_CNPJ.length() == 14) { return cnpj(CPF_CNPJ); } return false; } public static boolean cnpj(String CNPJ) { CNPJ = desformatar(CNPJ); if (!CNPJ.matches("[0-9]")) { return false; } int acumulador = 0; int digito = 0; StringBuilder cnpj = new StringBuilder(); char[] CNPJCharArray = CNPJ.toCharArray(); cnpj.append(CNPJ.substring(0, 12)); for (int i = 0; i < 4; i++) { if (((CNPJCharArray[i] - 48) >= 0) && ((CNPJCharArray[i] - 48) = 0) && ((CNPJCharArray[i + 4] - 48) = 0) && ((CNPJCharArray[i] - 48) = 0) && ((CNPJCharArray[i + 5] - 48) 1) { digito = 11 - resto; } if (digito == Math.abs(Integer.parseInt(PGU.substring(8, 1)))) { return true; } return false; } private static boolean renach(String CNH) { CNH = desformatar(CNH); if (!CNH.matches("[0-9]")) { return false; } if (CNH.equals("11111111111") || CNH.equals("22222222222") || CNH.equals("33333333333") || CNH.equals("44444444444") || CNH.equals("55555555555") || CNH.equals("66666666666") || CNH.equals("77777777777") || CNH.equals("88888888888") || CNH.equals("99999999999") || CNH.equals("00000000000")) { return false; } int[] fracao = new int[9]; int acumulador = 0; int inc = 2; for (int i = 0; i < 9; i++) { fracao[i] = (Math.abs(Integer.parseInt(CNH.substring(i, i + 1)))) * inc; acumulador += fracao[i]; inc++; } int resto = acumulador % 11; int digito1 = 0; if (resto > 1) { digito1 = 11 - resto; } acumulador = digito1 * 2; inc = 3; for (int i = 0; i < 9; i++) { fracao[i] = (Math.abs(Integer.parseInt(CNH.substring(i, i + 1)))) * inc; acumulador += Math.abs(fracao[i]); inc++; } resto = acumulador % 11; int digito2 = 0; if (resto > 1) { digito2 = 11 - resto; } if (digito1 == Math.abs(Integer.parseInt(CNH.substring(9, 10))) && digito2 == Math.abs(Integer.parseInt(CNH.substring(10, 11)))) { return true; } return false; } private static String desformatar(String valor) { String str = ""; String caracter = ""; for (int i = 0; i < valor.length(); i++) { caracter = valor.substring(i, i + 1); if (ehNumero(caracter)) { str += caracter; } } return str; } private static boolean ehNumero(String caracter) { for (int i = 0; i
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar