Validação Técnica do NIF Português
O NIF português utiliza o algoritmo módulo 11 com pesos decrescentes para validação. Este guia técnico explica o algoritmo em detalhe, com exemplos e implementações em código.
Estrutura do NIF
O NIF é composto por 9 dígitos:
- Posição 1: Tipo de entidade (1, 2, 3, 5, 6, 7, 8 ou 9)
- Posições 2-8: Número sequencial
- Posição 9: Dígito de controlo (check digit)
Algoritmo Módulo 11
Passo 1: Aplicar Pesos
Multiplique cada um dos primeiros 8 dígitos pelos pesos 9, 8, 7, 6, 5, 4, 3, 2:
| Posição | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| Peso | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
Passo 2: Somar Resultados
Some todos os produtos obtidos.
Passo 3: Calcular Resto
Calcule: resto = soma mod 11
Passo 4: Obter Dígito de Controlo
Calcule: controlo = 11 - resto
Se controlo for 10 ou 11, o dígito de controlo é 0.
Exemplo: NIF 213456789
| Dígito | Peso | Produto |
|---|---|---|
| 2 | 9 | 18 |
| 1 | 8 | 8 |
| 3 | 7 | 21 |
| 4 | 6 | 24 |
| 5 | 5 | 25 |
| 6 | 4 | 24 |
| 7 | 3 | 21 |
| 8 | 2 | 16 |
| Soma | 157 | |
Resto: 157 mod 11 = 3
Dígito de controlo: 11 - 3 = 8
O dígito fornecido (9) ≠ calculado (8), portanto NIF inválido.
Implementação em JavaScript
function validarNIF(nif) {
nif = nif.replace(/\s/g, '');
if (!/^\d{9}$/.test(nif)) return false;
const pesos = [9, 8, 7, 6, 5, 4, 3, 2];
let soma = 0;
for (let i = 0; i < 8; i++) {
soma += parseInt(nif[i]) * pesos[i];
}
let controlo = 11 - (soma % 11);
if (controlo >= 10) controlo = 0;
return controlo === parseInt(nif[8]);
}
Implementação em Python
def validar_nif(nif):
nif = nif.replace(" ", "")
if not nif.isdigit() or len(nif) != 9:
return False
pesos = [9, 8, 7, 6, 5, 4, 3, 2]
soma = sum(int(nif[i]) * pesos[i] for i in range(8))
controlo = 11 - (soma % 11)
if controlo >= 10:
controlo = 0
return controlo == int(nif[8])
Importante: A validação de formato apenas confirma que o número está matematicamente correto. Não garante que o NIF existe ou está ativo. Para verificações oficiais, consulte o Portal das Finanças.