Validação de CMC7

3 respostas
M

Validação de CMC7 (aqueles numerozinhos no rodapé de uma folha de cheque)

/*************************************
* 341026200184356765450006083914
* 1111111A2222222222B3333333333C
* 
* Regra:
* MOD10(campo 2) == A
* MOD10(campo 1) == B
* MOD10(campo 3) == C
* 
**************************************/

public boolean validarCMC7(final String campo) {

        //String teste = "341026200184356765450006083914";
        String regexValida = "\\d{8}\\d{10}\\d{12}";
        String regexInvalida = "[0]{8}[0]{10}[0]{12}";

        Pattern invalido = Pattern.compile(regexInvalida);
        Pattern valido = Pattern.compile(regexValida);

        Matcher mInvalido = invalido.matcher(campo);
        Matcher mValido = valido.matcher(campo);

        if ( (mInvalido.matches()) || (! mValido.matches()) ) {
            return false;
        }

        String grupo1 = campo.substring(0,7);
        String grupo2 = campo.substring(8,18);
        String grupo3 = campo.substring(19,29);

        boolean ret1 = (modulo10(grupo1).equals(campo.substring(18,19)));
        boolean ret2 = (modulo10(grupo2).equals(campo.substring(7,8)));
        boolean ret3 = (modulo10(grupo3).equals(campo.substring(29,30)));

        if( ret1 && ret2 && ret3) {
            return true;
        } else {
            return false;
        }
        
    }

    /**
    * Função modulo10. Calcula o módulo10 de uma string numerica e retorna
    * o digito
    *
    * 	@param numero
    *		String contendo o numero a ter o mod10 calculado
    *
    * 	@return	String
    *           String contendo o DAC do numero calculado
    *
    */
    private String modulo10(String numero) {

        int multi, posicao1, posicao2, acumula, resultado, dac;

        dac = 0;
        posicao1 = numero.length()-1;
        multi   = 2;
        acumula = 0;

        while (posicao1 >= 0) {

            resultado = Integer.parseInt(numero.substring(posicao1, posicao1 + 1)) * multi;
            posicao2  = Integer.toString(resultado).length()-1;

            while (posicao2 >= 0) {
                acumula += Integer.parseInt(Integer.toString(resultado).substring(posicao2,posicao2 + 1));
                posicao2--;
            }

            multi = (multi == 2) ? 1 : 2;
            posicao1--;
        }

        dac = acumula % 10;
        dac = 10 - dac;

        if (dac == 10) {
            dac = 0;
        }

        return String.valueOf(dac);
     }

Qualquer melhoria, por favor comentem aê...

3 Respostas

M

Duas coisas:

  1. Não seria mais simples escrever as regexs como:
"\\d{30}";
"[0]{30}";
  1. No return do seu método você poderia simplesmente fazer:
return ret1 && ret2 && ret3;

Na minha opinião fica mais claro assim.

M

marcobiscaro2112:
Duas coisas:

  1. Não seria mais simples escrever as regexs como:
"\\d{30}";
"[0]{30}";
  1. No return do seu método você poderia simplesmente fazer:
return ret1 && ret2 && ret3;

Na minha opinião fica mais claro assim.

Tanto faz… Chamo isso de estilo de prgramação.

Em relação ao teste do tamanho do CMC7, me ocorreu agora. Existem cheques mais antigos cujo tamanho do CMC7 é diferente. Seria preciso checar no site da Febraban como é isso…

R

Criado 19 de janeiro de 2010
Ultima resposta 19 de abr. de 2014
Respostas 3
Participantes 3