É normal, diversos sites terem requisitos de introdução do Número de Contribuinte.
Mas o que nem toda a gente sabe, é como se procede à sua validação.
Em um dos trabalhos que já efectuei, tive de pesquisar sobre isso, entrei em contacto com o IIES o qual me facultou o algoritmo para a sua verificação. Podes consultar aqui a descrição do algoritmo em PDF.
A regra geral da validação é:
- O NIF 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.
Agora o código em ASP:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Validação do NIF</title>
<script src="valida.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp :Label ID="Label1" runat="server" Text="Nº de Contribuinte:"></asp>
<asp :TextBox ID="txtNIF" runat="server"></asp>
<asp :RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtNIF"
Display="Dynamic" ErrorMessage="Tem de preencher o nº de Contribuinte." ValidationGroup="NIF"
Enabled="False">*</asp>
<asp :CustomValidator ID="CustomValidator1" runat="server" ClientValidationFunction="ValidateNIF"
ControlToValidate="txtNIF" Display="Dynamic" ErrorMessage="Número de Contribuinte Inválido."
ValidationGroup="NIF">*</asp>
</div>
<asp :Button ID="Button1" runat="server" Text="Enviar" ValidationGroup="NIF" />
<asp :ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="NIF" />
</form>
</body>
</html>
Agora com recurso ao JavaScript, validamos o NIF:
function ValidateNIF(sender, args)
{
args.IsValid = IsValidNIF(args.Value);
}
function IsValidNIF(nif)
{
var c;
var checkDigit = 0;
//Verifica se é nulo, se é numérico e se tem 9 dígitos
if(nif != null && IsNumeric(nif) && nif.length == 9)
{
//Obtem o primeiro número do NIF
c = nif.charAt(0);
//Verifica se o primeiro número é (1, 2, 5, 6, 8 ou 9)
if(c == '1' || c == '2' || c == '5' || c == '6' || c == '8' || c == '9')
{
//Calculo do Digito de Controle
checkDigit = c * 9;
var i = 0;
for(i = 2; i < = 8; i++)
{
checkDigit += nif.charAt(i-1) * (10-i);
}
checkDigit = 11 - (checkDigit % 11);
//Se o digito de controle é maior que dez, coloca-o a zero
if(checkDigit >= 10)
checkDigit = 0;
//Compara o digito de controle com o último numero do NIF
//Se igual, o NIF é válido.
if(checkDigit == nif.charAt(8))
return true;
}
}
return false;
}
function IsNumeric(ObjVal)
{
return /^\d+$/.test(ObjVal);
}






