JavaScript / jQuery
Você está aqui: Home » JavaScript / jQuery » Tratamento de CPF e CNPJ
Tratamento de CPF e CNPJ

Tratamento de CPF e CNPJ
Funções JavaScript para CPF e CNPJ
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().
cpf_cnpj.js
Download: cpf_cnpj.js.
/** * @author Márcio d'Ávila * @version 1.01, 2004 * * 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, false, pIsCnpj); calculado = calculado.substring(2, maxDigitos); 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); 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; i<NUM_DIGITOS_CPF; i++) { algUnico = 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); 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; i<NUM_DGT_CNPJ_BASE; i++) { algUnico = 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
Referências:
- Teoria numérica: cálculo de dígitos verificadores Módulo 11.
- Ato Declaratório Executivo nº 1, Anexo I da Receita Federal, 23 de maio de 2002 (documento Microsoft Word).
© 2003-2005, Márcio d'Ávila, mhavila.com.br, todos os direitos reservados. O texto e código-fonte apresentados podem ser referenciados 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.
Outros artigos postados por este autor
- Curso Adobe Flash - Desenho Avançado
- Action Script 2.0 ( Primeira Parte )
- Recortando uma foto 3x4
- Tratamento de CPF e CNPJ
- Retirando o Fundo de uma Foto no Photoshop
- Artigo Arrays II
Artigos relacionados sobre JavaScript / jQuery
- 10 Dicas JavaScript e Boas Práticas
- Validação de Formularios em JSP
- Interagindo com o teclado dinâmicamente - Parte II
- Entendendo os seletores do jQuery
- Tutorial jQuery – Método $.live();
- Comprimindo arquivos JavaScript e CSS com GZIP
Parceiros
BR-Linux.org
Criar WEB
Regularização de Imoveis SP
Montagens de Sites
Templates de Sites
Desenvolvedor de Sites
Elaboração de Sites
Produção de Sites
Programador de Sites
Criadores de Sites
Artigos mais acessados
Desenho de Letras - Construindo fontes TTF
Criando um sistema de login
Enviando email em formato HTML em PHP
Menu Circular em 3D
Cargos e salários na área de informática
Como fazer e modificar calendários
Action Script 2.0 ( Primeira Parte )
10 dicas de Webdesign para salvar seu site
Fireworks VS Photoshop
Serviços
Desenvolvimento de Sites e Sistemas WEB
Otimização de Sites (SEO)
Loja Virtual com Sistema Pagseguro
Sistema de Compra Coletiva
Catálogo de Produtos
Parcerias e Soluções de Publicidade
Portifólio Grupo SOS Designers
Fale Conosco







