Find out what the verification digit of a CNPJ

1

I have a class where I can find out if the CNPJ entered by the user is valid or not.

What I would like to do, and what I can not do, is show the user the last two valid digits he should type.

For example:

MessageBox("CNPJ inválido, o Digito Verificador correto seria: "+DV);

I would like to do this for the CNPJ and CPF.

The validation method of the CNPJ is as follows:

public bool ValidaCNPJ(string vrCNPJ)
    {
        int nrDig;
        string CNPJ = vrCNPJ.Replace(".", "");
        CNPJ = CNPJ.Replace("/", "");
        CNPJ = CNPJ.Replace("-", "");

        string ftmt = "6543298765432";
        int[] digitos = new int[14];
        int[] soma = new int[2];
        soma[0] = 0;
        soma[1] = 0;
        int[] resultado = new int[2];
        resultado[0] = 0;
        resultado[1] = 0;
        bool[] CNPJOk = new bool[2];
        CNPJOk[0] = false;
        CNPJOk[1] = false;

        try
        {
            for (nrDig = 0; nrDig < 14; nrDig++)
            {
                digitos[nrDig] = int.Parse(
                 CNPJ.Substring(nrDig, 1));
                if (nrDig <= 11)
                    soma[0] += (digitos[nrDig] *
                    int.Parse(ftmt.Substring(
                      nrDig + 1, 1)));
                if (nrDig <= 12)
                    soma[1] += (digitos[nrDig] *
                    int.Parse(ftmt.Substring(
                      nrDig, 1)));
            }

            for (nrDig = 0; nrDig < 2; nrDig++)
            {
                resultado[nrDig] = (soma[nrDig] % 11);
                if ((resultado[nrDig] == 0) || (resultado[nrDig] == 1))
                    CNPJOk[nrDig] = (
                    digitos[12 + nrDig] == 0);

                else
                    CNPJOk[nrDig] = (
                    digitos[12 + nrDig] == (
                    11 - resultado[nrDig]));

            }

            return (CNPJOk[0] && CNPJOk[1]);
        }
        catch
        {
            return false;
        }

    }

Method to validate CPF

public bool ValidaCpf(string cpf)
{

    int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
    int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
    string tempCpf;
    string digito;

    int soma;
    int resto;

    cpf = cpf.Trim();
    cpf = cpf.Replace(".", "").Replace("-", "");

    if (cpf.Length != 11)
    {
        return false;
    }
    tempCpf = cpf.Substring(0, 9);

    soma = 0;

    for (int i = 0; i < 9; i++)
    {
        soma += int.Parse(tempCpf[i].ToString()) * (multiplicador1[i]);
    }
    resto = soma % 11;

    if (resto < 2)
    {
        resto = 0;
    }
    else
    {
        resto = 11 - resto;
    }

    digito = resto.ToString();
    tempCpf = tempCpf + digito;
    int soma2 = 0;

    for (int i = 0; i < 10; i++)
    {
        soma2 += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];
    }

    resto = soma2 % 11;

    if (resto < 2)
    {
        resto = 0;
    }
    else
    {
        resto = 11 - resto;
    }

    digito = digito + resto.ToString();
    return cpf.EndsWith(digito);
}
    
asked by anonymous 29.04.2015 / 13:14

2 answers

2

Sorry for not seeing much usefulness in your final implementation, as mentioned in the comments of @ramaral, I will help you in the problem itself.

You can use the out C # parameters to to retrieve from the validation method the verifier digits, where the implementation would look something like this (there are comments on the rows changed):

// adicione o paramêtro out string dv
public bool ValidaCpf(string cpf, out string dv)
{
    int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
    int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
    string tempCpf;
    string digito;

    int soma;
    int resto;

    cpf = cpf.Trim();
    cpf = cpf.Replace(".", "").Replace("-", "");

    if (cpf.Length != 11)
    {
        // adicione essa linha, onde você seta o parâmetro out dv, com null, para fins de compilação, já que não há valor a ser adicionado, ou se acha melhor pode adicionar qualquer outro valor default.
        dv = null;
        return false;
    }
    tempCpf = cpf.Substring(0, 9);

    soma = 0;

    for (int i = 0; i < 9; i++)
    {
        soma += int.Parse(tempCpf[i].ToString()) * (multiplicador1[i]);
    }
    resto = soma % 11;

    if (resto < 2)
    {
        resto = 0;
    }
    else
    {
        resto = 11 - resto;
    }

    digito = resto.ToString();
    tempCpf = tempCpf + digito;
    int soma2 = 0;

    for (int i = 0; i < 10; i++)
    {
        soma2 += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];
    }

    resto = soma2 % 11;

    if (resto < 2)
    {
        resto = 0;
    }
    else
    {
        resto = 11 - resto;
    }

    digito = digito + resto.ToString();

    // adicione essa linha, onde você seta o parâmetro out dv, com o digito verificador valido
    dv = digito;
    return cpf.EndsWith(digito);
}

Where an example of usage would be this:

public void TestUtilizacao()
{
    string dv = null;
    string cpf = "12345678901";
    if(ValidaCpf(cpf, out dv))
    {
        MessageBox.Show("CPF valido");
    }else
    {
        MessageBox.Show("CPF inválido, o Digito Verificador correto seria: " + dv);
    }
}

The result of the usage test would be "Invalid CPF, the correct Verifier Digit would be: 09".

    
29.04.2015 / 13:45
1
public static bool IsCnpj(string cnpj)
    {
        int[] multiplicador1 = new int[12] {5,4,3,2,9,8,7,6,5,4,3,2};
        int[] multiplicador2 = new int[13] {6,5,4,3,2,9,8,7,6,5,4,3,2};
        int soma;
        int resto;
        string digito;
        string tempCnpj;

        cnpj = cnpj.Trim();
        cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");

        if (cnpj.Length != 14)
           return false;

        tempCnpj = cnpj.Substring(0, 12);

        soma = 0;
        for(int i=0; i<12; i++)
           soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];

        resto = (soma % 11);
        if ( resto < 2)
           resto = 0;
        else
           resto = 11 - resto;

        digito = resto.ToString();

        tempCnpj = tempCnpj + digito;
        soma = 0;
        for (int i = 0; i < 13; i++)
           soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];

        resto = (soma % 11);
        if (resto < 2)
            resto = 0;
        else
           resto = 11 - resto;

        digito = digito + resto.ToString();

        if cnpj.Right(2) <> digito
           MsgBox("CNPJ inválido, o Digito Verificador correto seria: "+digito);

        return cnpj.EndsWith(digito);
    }
    
29.04.2015 / 13:46