O formul�rio a seguir exemplifica o uso das fun��es �teis para formata��o e
valida��o de CPF e CNPJ implementadas em JavaScript: unformatNumber()
,
formatCpfCnpj()
, dvCpfCnpj()
, isCpf()
,
isCnpj()
, isCpfCnpj()
.
Download: cpf_cnpj.js.
/** * @author Márcio d'Ávila * @version 1.03, 2004-2008 * http://www.mhavila.com.br/topicos/web/cpf_cnpj.html * * Licenciado sob os termos da licen�a Creative Commons, * Atribui��o - Compartilhamento pela mesma licen�a 2.5: * http://creativecommons.org/licenses/by-sa/2.5/br/ * * PROTÓTIPOS: * método String.lpad(int pSize, char pCharPad) * método String.trim() * * String unformatNumber(String pNum) * String formatCpfCnpj(String pCpfCnpj, boolean pUseSepar, boolean pIsCnpj) * String dvCpfCnpj(String pEfetivo, boolean pIsCnpj) * boolean isCpf(String pCpf) * boolean isCnpj(String pCnpj) * boolean isCpfCnpj(String pCpfCnpj) */ var NUM_DIGITOS_CPF = 11; var NUM_DIGITOS_CNPJ = 14; var NUM_DGT_CNPJ_BASE = 8; /** * Adiciona método lpad() à classe String. * Preenche a String à esquerda com o caractere fornecido, * até que ela atinja o tamanho especificado. */ String.prototype.lpad = function(pSize, pCharPad) { var str = this; var dif = pSize - str.length; var ch = String(pCharPad).charAt(0); for (; dif>0; dif--) str = ch + str; return (str); } //String.lpad /** * Adiciona método trim() à classe String. * Elimina brancos no início e fim da String. */ String.prototype.trim = function() { return this.replace(/^\s*/, "").replace(/\s*$/, ""); } //String.trim /** * Elimina caracteres de formatação e zeros à esquerda da string * de número fornecida. * @param String pNum * String de número fornecida para ser desformatada. * @return String de número desformatada. */ function unformatNumber(pNum) { return String(pNum).replace(/\D/g, "").replace(/^0+/, ""); } //unformatNumber /** * Formata a string fornecida como CNPJ ou CPF, adicionando zeros * à esquerda se necessário e caracteres separadores, conforme solicitado. * @param String pCpfCnpj * String fornecida para ser formatada. * @param boolean pUseSepar * Indica se devem ser usados caracteres separadores (. - /). * @param boolean pIsCnpj * Indica se a string fornecida é um CNPJ. * Caso contrário, é CPF. Default = false (CPF). * @return String de CPF ou CNPJ devidamente formatada. */ function formatCpfCnpj(pCpfCnpj, pUseSepar, pIsCnpj) { if (pIsCnpj==null) pIsCnpj = false; if (pUseSepar==null) pUseSepar = true; var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF; var numero = unformatNumber(pCpfCnpj); numero = numero.lpad(maxDigitos, '0'); if (!pUseSepar) return numero; if (pIsCnpj) { reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/; numero = numero.replace(reCnpj, "$1.$2.$3/$4-$5"); } else { reCpf = /(\d{3})(\d{3})(\d{3})(\d{2})$/; numero = numero.replace(reCpf, "$1.$2.$3-$4"); } return numero; } //formatCpfCnpj /** * Calcula os 2 dígitos verificadores para o número-efetivo pEfetivo de * CNPJ (12 dígitos) ou CPF (9 dígitos) fornecido. pIsCnpj é booleano e * informa se o número-efetivo fornecido é CNPJ (default = false). * @param String pEfetivo * String do número-efetivo (SEM dígitos verificadores) de CNPJ ou CPF. * @param boolean pIsCnpj * Indica se a string fornecida é de um CNPJ. * Caso contrário, é CPF. Default = false (CPF). * @return String com os dois dígitos verificadores. */ function dvCpfCnpj(pEfetivo, pIsCnpj) { if (pIsCnpj==null) pIsCnpj = false; var i, j, k, soma, dv; var cicloPeso = pIsCnpj? NUM_DGT_CNPJ_BASE: NUM_DIGITOS_CPF; var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF; var calculado = formatCpfCnpj(pEfetivo + "00", false, pIsCnpj); calculado = calculado.substring(0, maxDigitos - 2); var result = ""; for (j = 1; j <= 2; j++) { k = 2; soma = 0; for (i = calculado.length-1; i >= 0; i--) { soma += (calculado.charAt(i) - '0') * k; k = (k-1) % cicloPeso + 2; } dv = 11 - soma % 11; if (dv > 9) dv = 0; calculado += dv; result += dv } return result; } //dvCpfCnpj /** * Testa se a String pCpf fornecida é um CPF válido. * Qualquer formatação que não seja algarismos é desconsiderada. * @param String pCpf * String fornecida para ser testada. * @return <code>true</code> se a String fornecida for um CPF válido. */ function isCpf(pCpf) { var numero = formatCpfCnpj(pCpf, false, false); if (numero.length > NUM_DIGITOS_CPF) return false; var base = numero.substring(0, numero.length - 2); var digitos = dvCpfCnpj(base, false); var algUnico, i; // Valida dígitos verificadores if (numero != "" + base + digitos) return false; /* Não serão considerados válidos os seguintes CPF: * 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. */ algUnico = true; for (i=1; algUnico && i<NUM_DIGITOS_CPF; i++) { algUnico = (numero.charAt(i-1) == numero.charAt(i)); } return (!algUnico); } //isCpf /** * Testa se a String pCnpj fornecida é um CNPJ válido. * Qualquer formatação que não seja algarismos é desconsiderada. * @param String pCnpj * String fornecida para ser testada. * @return <code>true</code> se a String fornecida for um CNPJ válido. */ function isCnpj(pCnpj) { var numero = formatCpfCnpj(pCnpj, false, true); if (numero.length > NUM_DIGITOS_CNPJ) return false; var base = numero.substring(0, NUM_DGT_CNPJ_BASE); var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12); var digitos = dvCpfCnpj(base + ordem, true); var algUnico; // Valida dígitos verificadores if (numero != "" + base + ordem + digitos) return false; /* Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS: * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555, * 66.666.666, 77.777.777, 88.888.888, 99.999.999. */ algUnico = numero.charAt(0) != '0'; for (i=1; algUnico && i<NUM_DGT_CNPJ_BASE; i++) { algUnico = (numero.charAt(i-1) == numero.charAt(i)); } if (algUnico) return false; /* Não será considerado válido CNPJ com número de ORDEM igual a 0000. * Não será considerado válido CNPJ com número de ORDEM maior do que 0300 * e com as três primeiras posições do número BÁSICO com 000 (zeros). * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000. */ if (ordem == "0000") return false; return (base == "00000000" || parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000"); } //isCnpj /** * Testa se a String pCpfCnpj fornecida é um CPF ou CNPJ válido. * Se a String tiver uma quantidade de dígitos igual ou inferior * a 11, valida como CPF. Se for maior que 11, valida como CNPJ. * Qualquer formatação que não seja algarismos é desconsiderada. * @param String pCpfCnpj * String fornecida para ser testada. * @return <code>true</code> se a String fornecida for um CPF ou CNPJ válido. */ function isCpfCnpj(pCpfCnpj) { var numero = pCpfCnpj.replace(/\D/g, ""); if (numero.length > NUM_DIGITOS_CPF) return isCnpj(pCpfCnpj) else return isCpf(pCpfCnpj); } //isCpfCnpj
Agradecimento: A Gabriel Lana, que apontou um bug na valida��o, que aceitava CNPF ou CNPJ com mais do que o m�ximo de d�gitos permitidos como v�lido.
© 2003-2020, M�rcio d'�vila, mhavila.com.br, direitos reservados. O texto e c�digo-fonte apresentados podem ser referenciados, distribu�dos e utilizados, desde que expressamente citada esta fonte e o cr�dito do(s) autor(es). A informa��o aqui apresentada, apesar de todo o esfor�o para garantir sua precis�o e corre��o, � oferecida "como est�", sem quaisquer garantias expl�citas ou impl�citas decorrentes de sua utiliza��o ou suas conseq��ncias diretas e indiretas.