Skip to content

Instantly share code, notes, and snippets.

@iuriguilherme
Created December 28, 2022 14:01
Show Gist options
  • Save iuriguilherme/776161121c8fd4adc647a71cfde13222 to your computer and use it in GitHub Desktop.
Save iuriguilherme/776161121c8fd4adc647a71cfde13222 to your computer and use it in GitHub Desktop.
Verificador de CPF válido em Javascript
/*
* Validador e gerador de CPF em javascript
* Domínio Público 2016
* Faça péssimo uso
*/
// http://run.plnkr.co/plunks/93FPpacuIcXqqKMecLdk/
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
// Elimina tudo o que não for número
function validaNumero(numero) {
numero = String(numero);
numero = numero.replace(/\D/g,'');
numero = numero.replace(/\d{2,}/g,'');
if (isNumeric(numero))return parseInt(numero);
return '';
}
// Acrescenta pontos e hífens no número de CPF
function formataCPF(cpf) {
while (cpf.length < 11) cpf.push('_');
return (
cpf[0].toString()
+ cpf[1].toString()
+ cpf[2].toString()
+ '.'
+ cpf[3].toString()
+ cpf[4].toString()
+ cpf[5].toString()
+ '.'
+ cpf[6].toString()
+ cpf[7].toString()
+ cpf[8].toString()
+ '-'
+ cpf[9].toString()
+ cpf[10].toString()
);
}
// Validação do módulo do dígito verificador do CPF
function calculaModulo(limite, cpf) {
var incremento = 0;
var soma = 0;
for (var i = (limite-1); i > 1; i--) {
soma = soma + (i * cpf[incremento]);
incremento++;
}
var modulo = (soma % limite);
if (modulo >= 2 ) return (limite - modulo);
return 0;
}
/*
* Verifica se todos dígitos são iguais.
* Os seguintes números de CPF são inválidos por definição:
* 000.000.000-00
* 111.111.111-11
* 222.222.222-22
* 333.333.333-33
* 444.444.444-44
* 555.555.555-55
* 666.666.666-66
* 777.777.777-77
* 888.888.888-88
* 999.999.999-99
*/
function validaCPF(cpf) {
for (var i = 0; i < cpf.length; i++) {
if (cpf[0].toString() != cpf[i].toString()) return false;
}
return true;
}
//Gera número aleatório entre 0 e 9.
function digitoAleatorio() {
return Math.floor(Math.random() * 10);
}
// Variáveis
var limite = 11;
var numero = 0;
var digitoPrimeiro = 0;
var digitoSegundo = 0;
var resposta = '';
var cpf = new Array();
// Receber nove números
for (var i = 0; i < 9; i++) {
do numero = validaNumero(
prompt(
formataCPF(cpf.slice(0))
+ "\nDigite um número natural de 0 a 9:", digitoAleatorio())
);
while (!isNumeric(numero));
cpf[i] = numero;
}
// O primeiro dígito verificador deve ser calculado antes, porque o cálculo do segundo depende do primeiro
digitoPrimeiro = calculaModulo(limite, cpf.slice(0));
cpf.push(digitoPrimeiro);
digitoSegundo = calculaModulo(limite, cpf.slice(0));
cpf.push(digitoSegundo);
resposta = "O CPF gerado a partir dos nove números fornecidos é: " + formataCPF(cpf.slice(0))
// Verifica validade
if (validaCPF(cpf.slice(0)))resposta = resposta + "\nNo entanto, este número de CPF é inválido.";
resposta = resposta + "\nConsulte a existência do CPF em https://www.receita.fazenda.gov.br/Aplicacoes/SSL/ATCTA/CPF/ConsultaPublica.asp";
// Imprime CPF
alert(resposta);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment