Jump to content

Archived

This topic is now archived and is closed to further replies.

marcio.theis

Validação de CPF/CNPJ

Recommended Posts

Segue o código para efetuar a validação do CPF/CNPJ, pode ser informado com ou sem máscara, sendo somente necessário declarar na uses StrUtils.

 

 

Validação CPF

Para chamar a função ValidaCPF(numero_do_CPF) sendo que o retorno será True ou False.

 

function TForm1.ValidaCPF(numCPF: string): boolean;var	cpf: string;	x, total, dg1, dg2: Integer;	ret: boolean;beginret:=True;for x:=1 to Length(numCPF) do	if not (numCPF[x] in ['0'..'9', '-', '.', ' ']) then		ret:=False;if ret then	begin	ret:=True;	cpf:='';	for x:=1 to Length(numCPF) do		if numCPF[x] in ['0'..'9'] then			cpf:=cpf + numCPF[x];	if Length(cpf) <> 11 then		ret:=False;	if ret then		begin		//1° dígito		total:=0;		for x:=1 to 9 do			total:=total + (StrToInt(cpf[x]) * x);		dg1:=total mod 11;		if dg1 = 10 then			dg1:=0;		//2° dígito		total:=0;		for x:=1 to 8 do			total:=total + (StrToInt(cpf[x + 1]) * (x));		total:=total + (dg1 * 9);		dg2:=total mod 11;		if dg2 = 10 then			dg2:=0;		//Validação final		if dg1 = StrToInt(cpf[10]) then			if dg2 = StrToInt(cpf[11]) then				ret:=True;		//Inválidos		case AnsiIndexStr(cpf,['00000000000','11111111111','22222222222','33333333333','44444444444',							   '55555555555','66666666666','77777777777','88888888888','99999999999']) of			0..9:   ret:=False;			end;		end	else		begin		//Se não informado deixa passar		if cpf = '' then			ret:=True;		end;	end;ValidaCPF:=ret;end;

Validação CNPJ

Para chamar a função ValidaCNPJ(numero_do_CNPJ) sendo que o retorno será True ou False.

 

function TForm1.ValidaCNPJ(numCNPJ: string): boolean;var  cnpj: string;  dg1, dg2: integer;  x, total: integer;  ret: boolean;beginret:=False;cnpj:='';//Analisa os formatosif Length(numCNPJ) = 18 then	if (Copy(numCNPJ,3,1) + Copy(numCNPJ,7,1) + Copy(numCNPJ,11,1) + Copy(numCNPJ,16,1) = '../-') then		begin		cnpj:=Copy(numCNPJ,1,2) + Copy(numCNPJ,4,3) + Copy(numCNPJ,8,3) + Copy(numCNPJ,12,4) + Copy(numCNPJ,17,2);		ret:=True;		end;if Length(numCNPJ) = 14 then	begin	cnpj:=numCNPJ;	ret:=True;	end;//Verificaif ret then	begin	try		//1° digito		total:=0;		for x:=1 to 12 do			begin			if x < 5 then				Inc(total, StrToInt(Copy(cnpj, x, 1)) * (6 - x))			else				Inc(total, StrToInt(Copy(cnpj, x, 1)) * (14 - x));			end;		dg1:=11 - (total mod 11);		if dg1 > 9 then			dg1:=0;		//2° digito		total:=0;		for x:=1 to 13 do			begin			if x < 6 then				Inc(total, StrToInt(Copy(cnpj, x, 1)) * (7 - x))			else				Inc(total, StrToInt(Copy(cnpj, x, 1)) * (15 - x));			end;		dg2:=11 - (total mod 11);		if dg2 > 9 then			dg2:=0;		//Validação final		if (dg1 = StrToInt(Copy(cnpj, 13, 1))) and (dg2 = StrToInt(Copy(cnpj, 14, 1))) then			ret:=True		else			ret:=False;	except		ret:=False;		end;	//Inválidos	case AnsiIndexStr(cnpj,['00000000000000','11111111111111','22222222222222','33333333333333','44444444444444',						   '55555555555555','66666666666666','77777777777777','88888888888888','99999999999999']) of		0..9:   ret:=False;		end;	end;ValidaCNPJ:=ret;end;

Share this post


Link to post
Share on other sites

Uma dúvidaFiz um programa de impressao de boletoslá tem um campo CPF/CNPJComo fazer para identificar se a pessoa digitou cpf ou cnpj no onexit e deixar o campo formatado ?e tbm usar essa funcao lá?tem como?

Share this post


Link to post
Share on other sites

OK, mas essa funcao n esta funcionando aqui comigo

 

p chamar usei assim:

 

if ValidaCPF(edit1.text) = false thenshowmessage('Errado')elseshowmessage('OK')

só q da ok para todos..só da errado se o numero for mairo que 11

 

alguma ideia de onde estou errando?

Share this post


Link to post
Share on other sites

Olá pessoal!

 

Estou querendo usar essa função em um programa que estou fazendo como avaliação do curso, mas preciso entender como ele funciona. Algumas coisas eu consegui entender, mas tem uma parte do código que eu não entendi. Será que alguém pode me explicar?

 

case AnsiIndexStr(cpf,['00000000000','11111111111','22222222222','33333333333','44444444444',

							   '55555555555','66666666666','77777777777','88888888888','99999999999']) of

			0..9:   ret:=False;

Share this post


Link to post
Share on other sites

Olá pessoal:

Estou usando esse código do CPF em um programa. Ele tah compilando direitinho, o único problema eh que tá validando todos os números que coloco, por mais que estejam errados. Como posso resolver esse problema?

Share this post


Link to post
Share on other sites

Cara, pra mim não deu certo, ele valida todos, segue o código do "OnExit" do meu DBedit:

 

procedure Tfrmcadastro.DBcpfcliExit(Sender: TObject);

 

var valorcpf : string;

 

begin

valorcpf := dbcpfcli.text;

if ValidaCPf(valorcpf) = false then

begin

lbvalido.caption := ('CPF Inválido');

lbvalido.color := (clRed)

end

else if ValidaCPF(valorcpf) = true then

lbvalido.caption := ('CPF válido');

lbvalido.color := (clGreen);

end;

Share this post


Link to post
Share on other sites

Cara, pra mim não deu certo, ele valida todos, segue o código do "OnExit" do meu DBedit:

 

procedure Tfrmcadastro.DBcpfcliExit(Sender: TObject);

 

var valorcpf : string;

 

begin

valorcpf := dbcpfcli.text;

if ValidaCPf(valorcpf) = false then

begin

lbvalido.caption := ('CPF Inválido');

lbvalido.color := (clRed)

end

else if ValidaCPF(valorcpf) = true then

lbvalido.caption := ('CPF válido');

lbvalido.color := (clGreen);

end;

 

 

O código tem um erro que acaba validando CPFs que não deveriam...

é só mudar essa parte do código:

 

//Validação final

if dg1 = StrToInt(cpf[10]) then

if dg2 = StrToInt(cpf[11]) then

ret:=True;

por essa:

 

//Validação final

if (dg1 = StrToInt(cpf[10])) and (dg2 = StrToInt(cpf[11])) then

ret:= True

else

ret:= False;

Share this post


Link to post
Share on other sites

Olá Fabio Zanardi,

 

Obrigado por compartilhar seu conhecimento conosco.

 

Continue contribuindo respondendo os tópicos mais recentes.

 

Abraços

 

Mário Monteiro

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.