Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] Outra solucao para o validador de CPF

Bom dia a todos Para encontrar uma solução para a verificação de CPF, eu procurei no google e achei um link interessante, que mostra essa solução pronta. Eu fiz pequenas alterações para encaixar com os princípios da aula anterior (fiquem à vontade para utilizar):

import java.util.InputMismatchException;
public class CPF {
    private String CPF;
    //link do código utilizado: https://www.4devs.com.br/gerador_de_cpf
    public CPF(String CPF) {
        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)){
            throw new IllegalArgumentException("CPF invalido");
        }
        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))){
                this.CPF = CPF;
            }
            else throw new IllegalArgumentException("CPF invalido");
        } catch (InputMismatchException erro) {
            throw new IllegalArgumentException("CPF invalido");
        }
    }
    public String imprimeCPF() {
        return(CPF.substring(0, 3) + "." + CPF.substring(3, 6) + "." +
                CPF.substring(6, 9) + "-" + CPF.substring(9, 11));
    }
}

E para confirmar, eu vou deixar o código do teste de verificação que eu fiz nos comentários (para não passar dos 5 mil caracteres).

Criticas e sugestões de melhoria, podem deixar um novo código nos comentários

2 respostas

Código da classe de testes (lembrando que esse CPF válido que aparece é de um site de gerador de CPF)(eu testei anteriormente com o meu CPF


import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class CPFTest {
    @Test
    public void TestaCPFValido(){
        //CPF pego num site de gerador de CPF https://www.4devs.com.br/gerador_de_cpf
        CPF cpf = new CPF("15297655870");
        assertEquals("152.976.558-70",cpf.imprimeCPF());
    }
    @Test
    public void TestaCPFInvalidoComMenosDe11Digitos(){
        assertThrows(IllegalArgumentException.class,() -> new CPF("1234567890"));
    }
    @Test
    public void TestaCPFInvalidoCom11DigitosRepetidos(){
        assertThrows(IllegalArgumentException.class,() -> new CPF("11111111111"));
    }
    @Test
    public void TestaCPFInvalidoCom11DigitosENumerosInvalidos(){
        assertThrows(IllegalArgumentException.class,() -> new CPF("12345678901"));
    }
    @Test
    public void TestaCPFInvalidoComMaisDe11Digitos(){
        assertThrows(IllegalArgumentException.class,() -> new CPF("123456789012"));
    }

}

captura de tela no IntelliJ mostrando que tive êxito nos 5 testes dessa classe

solução!

Oi Murilo! Tudo certinho?

Obrigada por compartilhar a sugestão de código! Também gosto muito desse site 4devs, é muito útil.

Bons estudos!