Skip to content

Instantly share code, notes, and snippets.

@Pipas
Last active January 18, 2023 19:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Pipas/69ab5b514a53a494ec2a80669e950569 to your computer and use it in GitHub Desktop.
Save Pipas/69ab5b514a53a494ec2a80669e950569 to your computer and use it in GitHub Desktop.
Validação de NIF Portugal com Javascript
function validateNIF(nif)
{
if(!['1', '2', '3', '5', '6', '8'].includes(nif.substr(0,1)) &&
!['45', '70', '71', '72', '77', '79', '90', '91', '98', '99'].includes(nif.substr(0,2)))
return false;
let total = nif[0] * 9 + nif[1] * 8 + nif[2] * 7 + nif[3] * 6 + nif[4] * 5 + nif[5] * 4 + nif[6] * 3 + nif[7] * 2;
let modulo11 = total - parseInt(total / 11) * 11;
let comparador = modulo11 == 1 || modulo11 == 0 ? 0 : 11 - modulo11;
return nif[8] == comparador
}
@Pipas
Copy link
Author

Pipas commented Apr 3, 2018

Obrigado ao @BlueDi e ao @LuisVilarBarbosa pela solução do primeiro if

@samuelcarreira
Copy link

A variável comparador deveria ser definida primeiro como prática de um bom código. De resto, obrigado pelo código!

Deixo aqui o código comprimido e compatível com versões do interpretador JS/browsers mais antigos (que não suportam por exemplo o let)

'use strict'; function validateNIF(a){if(a+='',!['1','2','3','5','6','8'].includes(a.substr(0,1))&&!['45','70','71','72','77','79','90','91','98','99'].includes(a.substr(0,2)))return!1;var d,b=9*a[0]+8*a[1]+7*a[2]+6*a[3]+5*a[4]+4*a[5]+3*a[6]+2*a[7],c=b-11*parseInt(b/11);return d=1==c||0==c?0:11-c,a[8]==d}

@Pipas
Copy link
Author

Pipas commented Jan 14, 2019

A variável comparador deveria ser definida primeiro como prática de um bom código.

Bem apontado, também modifiquei algumas partes do código para ficar mais conciso

@saomartinho
Copy link

Obrigado pelo código deu muito jeito.

@shiamalon
Copy link

shiamalon commented Sep 12, 2019

Typescript version:

function validateNIF(nif: string): boolean { if (!['1', '2', '3', '5', '6', '8'].includes(nif.substr(0, 1)) && !['45', '70', '71', '72', '77', '79', '90', '91', '98', '99'].includes(nif.substr(0, 2))) { return false; } const total = Number(nif[0]) * 9 + Number(nif[1]) * 8 + Number(nif[2]) * 7 + Number(nif[3]) * 6 + Number(nif[4]) * 5 + Number(nif[5]) * 4 + Number(nif[6]) * 3 + Number(nif[7]) * 2; const modulo11 = total - Math.trunc(total / 11) * 11; const comparador = modulo11 === 1 || modulo11 === 0 ? 0 : 11 - modulo11; return Number(nif[8]) === comparador; }

@raibtoffoletto
Copy link

Muito grato!

Ps: Talvez o uso de === (datatype check) seja melhor para evitar mensagens do eslint. ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment