1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

validação NIF

Discussão em 'Web Development' iniciada por tonebiclas, 20 de Fevereiro de 2009. (Respostas: 10; Visualizações: 9733)

  1. tonebiclas

    tonebiclas Power Member

    Boas, alguém têm algum script para validação de NIF's em PHP e/ou javascript ?

    já procurei e não encontrei, se alguem me puder ajudar agradeço.


    cumps ;)
     
  2. K0mA

    K0mA Power Member

    A titulo de curiosidade, e lembro que alguem ca no forum o perguntou, aqui fica a formula para validação do numero de contribuinte.

    Quote:
    Mensagem Original de CONTRIBUINTE
    - Tem que ter 9 dígitos
    - O primeiro dígito tem que ser 1, 2, 5, 6, 8 ou 9
    - A soma de controle dada por 9xd1+8xd2+7xd3+6xd4+5xd5+4xd6+3xd7+2xd8+d9 tem que ser múltipla de 11 (congruente com o módulo 11, isto é, dê resto 0 quando dividida por 11). d1 é o dígito mais à esquerda, e d9 o digito mais à direita (digito de controle).
    - d9, em alguns casos, precisava de ter o valor 10, para que a soma de controle fosse divisível por 11. Neste caso d9 tomará o valor 0. Nitidamente uma decisão mal tomada, pois um dígito de controle igual a zero, poderá significar uma soma de controle correcta ou uma cujo resto da divisão por onze dá 1. O dígito de controle deveria ser, por exemplo, uma letra com os 11 possíveis valores de A a K. Por curiosidade, o mesmo erro, existe na validação dos BI.


    Quote:
    Mensagem Original de BILHETE DE IDENTIDADE
    A- Tomemos o número 8074662-4 como exemplo, e onde o último 4 é o algarismo mistério.
    B- Para verificar a veracidade deste número multiplica-se o último algarismo por 1 (4x1), o penúltimo algarismo por 2 (2x2), o antepenúltimo por 3 (6x3), e assim sucessivamente. Somando no final todos estes produtos, obtem-se 176.
    [(4x1) + (2x2) + (6x3) + (6x4) + (4x5) + (7x6) + (0x7) + (8x8) = 176]
    C- Divide-se este resultado por 11 e chega-se a um número que deverá ser inteiro
    [176 : 11 = 16].
    D- Se o resultado dessa divisão por 11 não der número inteiro, isso significa que o vosso B.I. é falso.
     
    Última edição pelo moderador: 20 de Fevereiro de 2009
  3. eralha

    eralha Power Member

    Não conhecia estes calculos de validações, apesar de saber que existiam, como nunca precisei em nenhum projecto. Fica já o conhecimento :D
     
  4. hostmake

    hostmake Power Member

    Tu também postaste isto no PortugalCode, e eu respondi-te lá no fórum.
    Mas como partilhar o conhecimento é engraçado, eu deixo aqui também a função que fiz.

    PHP:
    <?php
    function validarNIF($nif) {
        if ( (!
    is_null($nif)) && (is_numeric($nif)) && (strlen($nif)==9) && ($nif[0]==|| $nif[0]==|| $nif[0]==|| $nif[0]==|| $nif[0]==|| $nif[0]==9) ) {
            
    $dC $nif[0] * 9;
            for (
    $i=2;$i<=8;$i++)
                
    $dC += ($nif[$i-1])*(10-$i);
            
    $dC 11-($dC 11);
            
    $dC = ($dC>=10)?0:$dC;
            if (
    $dC==$nif[8])
                return 
    TRUE;
        }
    }

    $var validarNIF("123456789");

    if (
    $var)
    echo 
    "é valido";
    else
    echo 
    "é invalido";
    ?>
     
  5. tonebiclas

    tonebiclas Power Member

  6. boas

    ja tentei tudo e nao sei o que é que esta errado no meu calculo do nif
    o codigo esta em C#

    private Boolean ValidateContribuinte()
    {

    Boolean resultado = false;


    str_nif = tb_contribuinte.Text.Trim();
    double nif =0;


    try
    {
    nif = int.Parse(str_nif);




    if (str_nif.Length != 9)
    {
    resultado = false;
    }
    else
    {
    if (str_nif.StartsWith("1") || str_nif.StartsWith("2")
    || str_nif.StartsWith("5") || str_nif.StartsWith("6")
    || str_nif.StartsWith("7") || str_nif.StartsWith("8")
    || str_nif.StartsWith("9")
    )
    {

    int control = Convert.ToInt32(str_nif[0]) * 9;
    for (int j = 2; j <= 8; j++)
    {
    control += (10 - j) * Convert.ToInt32(str_nif[j-1]);
    }


    control = 11 - (control % 11);
    if (control >= 10)
    {
    control = 0;
    }


    if (control == Convert.ToInt32(str_nif[8]))
    {
    resultado = true;
    }
    else
    {
    resultado = false;
    }


    }


    }

    }
    catch
    {
    resultado = false;
    }
    return resultado;
    }
     
  7. ByMySlf

    ByMySlf Power Member

    Creio que assim funcionará...

    Código:
            Match match = Regex.Match(str_nif, @"\d{9}");
            
            if (match.Success)
            {
                 //Se o NIF for válido....    
            }
    
     
  8. obrigado pela dica tiras me um if/ else, e fica mais bonito o código

    eu verifiquei todas a condições 1 a 1 e o erro tem de estar neste pedaço de código

    int control = Convert.ToInt32(str_nif[0]) * 9;
    for (int j = 2; j <= 8; j++)
    {
    control += (10 - j) * Convert.ToInt32(str_nif[j-1]);
    }


    control = 11 - (control % 11);
    if (control >= 10)
    {
    control = 0;
    }


    if (control == Convert.ToInt32(str_nif[8]))
    {
    resultado = true;
    }
    else
    {
    resultado = false;
    }
     
  9. ByMySlf

    ByMySlf Power Member

    Aquele código substitui todo o teu código! Faz uso de expressões regulares para validar a string. No caso de um NIF, a string terá que ser composta por 9 algarismos.

    Código:
        private Boolean ValidateContribuinte(string str_nif) {
               Match match = Regex.Match(str_nif, @"\d{9}");
            
              if (match.Success)
              {
                    return true;   
              }
    
              return false;
        }
    
     
    Última edição: 25 de Junho de 2013
  10. Zalex

    Zalex Power Member

  11. ByMySlf

    ByMySlf Power Member

    Isto é o que faz ler somente o título e o resto, praticamente, ignorar! Portanto, estava somente a exemplificar uma validação básica.

    Para me redimir da estupidez anterior:

    Código:
         public bool IsValidNIF(string nif)
        {
            if (!Regex.IsMatch(nif, @"\d{9}"))
            {
                return false;
            }
            
            char firstChar = nif[0];
            if (firstChar.Equals('1') 
                || firstChar.Equals('2') 
                || firstChar.Equals('5') 
                || firstChar.Equals('6') 
                || firstChar.Equals('8') 
                || firstChar.Equals('9'))
            {
                int checkDigit = (Convert.ToInt32(firstChar.ToString()) * 9);
                for (int i = 2; i <= 8; ++i)
                {
                    checkDigit += Convert.ToInt32(nif[i - 1].ToString()) * (10 - i);
                }
    
                checkDigit = 11 - (checkDigit % 11);
                if (checkDigit >= 10) 
                {
                    checkDigit = 0;
                }
    
                [B]if (checkDigit.ToString() == nif[8].ToString())[/B]
                {
                    return true;
                }
            }
    
            return false;
        }
    
    O que está a bold no código acims é, precisamente, onde o teu está a falhar! Ao converteres o char para inteiro retorna-te o valor do caractere Unicode.

    Convert.ToInt32 Method (Char)
     

Partilhar esta Página