Para começar a movimentar o novo blog, vou postar uma série de artigos que eu escrevi como colunista de Flash no extinto portal FireMasters.
São vários artigos que até hoje fazem parte do meu “cinto-de-utilidades” como por exemplo códigos de validação de CPF, CNPJ e – esse deu trabalho – Inscrição Estadual. Além de artigos detalhados sobre classes específicas.
Então mãos à obra : o primeiro artigo é sobre validação de CPF.
Antes de mais nada, vamos entender como funcionar o algoritmo do CPF.
O CPF é composto por onze algarismos. Por exemplo 123.456.789-09
Os dois últimos algarismo são dígitos verificadores. Eles são criados a partir dos nove primeiros algarismos.
O cálculo é feito em duas etapas conforme informações ( algoritmo ) fornecidas pelo Ministério da Fazenda.
A primeira coisa a fazer é criar um campo texto Input e instanciá-lo como cpf_txt.
Crie um movieclip para servir como botão e instancie como enviar_btn.
Agora vamos colocar a ação na timelime principal do seu filme.
Para evitarmos que o usuário digite caracteres não-numéricos vamos usar a propriedade “restrict” que, como o próprio nome diz, restringe a digitação a apenas números.
cpf_txt.restrict = "0-9";
Indicamos a ação ao movieclip enviar_btn chamando a função de validação
enviar_btn.onRelease = function () {
validaCPF ();
};
E agora criamos a função que segue o padrão estabelecido do cálculo do CPF
function validaCPF ():Void {
//criamos arrays dos pesos
Peso1 = [10, 9, 8, 7, 6, 5, 4, 3, 2];
Peso2 = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2];
// criamos um string ( expressão ) para "pegarmos" o valor digitado
var cpfVal:String = new String ();
cpfVal = cpf_txt.text;
// criamos as variáveis que nos auxiliarão no cálculo dos dígitos verificadores
var soma1:Number = new Number ();
var resto1:Number = new Number ();
var soma2:Number = new Number ();
var resto2:Number = new Number ();
// utilizamos o for com o incremento i ( i++ )
for (i = 0; i < Peso1.length; i++) {
soma1 += cpfVal.charAt (i) * Peso1[i];
}
// o cálculo do resto é feito utilizando o operador % ( porcentagem )
// que retorna o resto da divisão da soma por 11
resto1 = soma1 % 11;
// criamos a condicão para o caso do resultado ser menor ou igual a 1
if (resto1 <= 1) {
// se for o digito verificador é igual a 0 ( zero )
digito1 = 0;
} else {
// senão é igual a 11 menos o resto
digito1 = 11 - resto1;
}
// agora o cálculo do segundo dígito que segue o mesmo padrão anterior
for (j = 0; j < Peso2.length; j++) {
soma2 += cpfVal.charAt (j) * Peso2[j];
}
resto2 = soma2 % 11;
if (resto2 <= 1) {
digito2 = 0;
} else {
digito2 = 11 - resto2;
}
// chegamos então a nossa condição final
// se o décimo digito - cpfVal.charAt(9) - for igual ( o símbolo == )
// ao dígito verificador calculado ou ...
// se o décimo digito - cpfVal.charAt(10) - for igual ao dígito verificador calculado ou ...
// o tamanho da número digitado for igual de onze algarismos
// lembrando que o charAt(9) indica a décima "casa" ( posição )
// porque a primeira "casa" é sempre 0 ( zero )
if (cpfVal.charAt (9) == digito1 && cpfVal.charAt (10) == digito2 && cpfVal.length == 11) {
// se todas as condições estiverem ok
// você pode acrescentar aqui outras ações do tipo ir para algum frame
// enviar as informações para o servidor
// etc
trace ( "CPF Válido" );
} else {
// senão ...
trace ( "CPF Inválido" );
}
}
É isso …
Esse código é um bom exercício de utilização dos operadores no Flash. Sejam aritméticos, lógicos, comparação, etc …
Aproveite para dar uma olhada no help do Flash para conhecer a fundo cada um deles.
Junior Disse:
on Maio 7, 2008 at 4:40 pm
Cara,
Parabéns!
Muito bom esse código!
Trabalho com flash tb, se quiser me add no msn,sinta-se a vontade!
Flws!
Eduardo Disse:
on Junho 11, 2008 at 6:36 pm
Prezado Marco, teria como vc me enviar a sua função em ActionScript (de pref. as3 mas também pode ser as2) que valida Inscrição Estadual ?
Abraço,
Eduardo
Fabiano Disse:
on Julho 2, 2008 at 4:25 am
Já estou usando seu script, só tem um detalhe que normalmente o pessoal esquece, se for colocado 99999999999, ou seja, repetir um número 11, o script não pega.
alirio Disse:
on Outubro 10, 2008 at 3:05 pm
pq apagar o comentario explicativo para o amigo de cima? não achou uma boa contribuição?
Carro Brasilia Disse:
on Dezembro 2, 2008 at 3:12 pm
Um super obrigado, estava precisando de uma dessa.
Só que vou converter ela para Flex.
Felipe Carmo Disse:
on Junho 23, 2009 at 2:30 am
Muito útil e super bem explicado.
Valeu!
Thiago Disse:
on Novembro 18, 2009 at 11:30 am
if (cpfVal.charAt(9) == digito1 && cpfVal.charAt(10) == digito2 && cpfVal.length == 11 && digito1 != digito2) {
alterei isso para nao aceitar numeros iguais.. =)