quarta-feira, 11 de junho de 2008

Formatação de CPF - Uma função simples

O CPF, número do Cadastro de Pessoa Física, apresenta o formato NNN.NNN.NNN-DD, onde N é número do CPF e D é dígito verificador. Uma vez que o mesmo é bastante utilizado, sua validação e apresentação são opções que podem ser implementadas dentro do banco de dados , com reuso do mesmo código para uso em vários sistemas.

Neste post vamos fazer uma função simplificada para formatação e apresentação de CPF.

A consulta abaixo faz a formatação de um CPF. Apresenta a desvantagem de se ter de repetir várias vezes o valor do CPF a ser apresentado.

SELECT substring('12345678912' FROM 1 FOR 3) || '.' || substring('12345678912' FROM 4 FOR 3) || '.' || substring('12345678912' FROM 7 FOR 3) || '-' || substring('12345678912' FROM 10 FOR 2);

O uso de uma função aumenta a simplicidade e facilita o reuso:

CREATE OR REPLACE FUNCTION CPF_formatar(par_cpf varchar(11)) RETURNS varchar(14) AS $$
-- ROTINA DE FORMATAÇÃO DE CPF
-- Código PL/ PGSQL: Cláudio Leopoldino - http://postgresqlbr.blogspot.com/
-- Retorna o CPF formatado no formato NNN.NNN.NNN-DD, onde N é número do CPF e D é dígito verificador
-- em caso de erro retorna 'ERRO'
BEGIN
IF char_length(par_cpf) != 11 THEN
RAISE NOTICE 'Formato inválido: %',$1;
RETURN 'ERRO';
END IF;
RETURN substring(par_cpf FROM 1 FOR 3) || '.' || substring(par_cpf FROM 4 FOR 3) || '.' || substring(par_cpf FROM 7 FOR 3) || '-' || substring(par_cpf FROM 10 FOR 2);
END;
$$ LANGUAGE PLPGSQL;

SELECT CPF_formatar('12345678912');

4 comentários:

Aurelio Barreto disse...

A partir dessa, criei uma para CNPJ:

CREATE OR REPLACE FUNCTION CNPJ_formatar(par_cnpj varchar(14)) RETURNS varchar(18) AS $$
-- ROTINA DE FORMATAÇÃO DE CNPJ
-- Retorna o CNPJ formatado no formato NN.NNN.NNN/NNNN-DD, onde N é número do CNPJ e D é dígito verificador
-- em caso de erro retorna 'ERRO'
BEGIN
IF char_length(par_cnpj) != 14 THEN
RAISE NOTICE 'Formato inválido: %',$1;
RETURN 'ERRO';
END IF;
RETURN substring(par_cnpj FROM 1 FOR 2) || '.' || substring(par_cnpj FROM 3 FOR 3) || '.' || substring(par_cnpj FROM 6 FOR 3) || '/' || substring(par_cnpj FROM 9 FOR 4) || '-' || substring(par_cnpj FROM 13 FOR 2);
END;
$$ LANGUAGE PLPGSQL;

Amaro José Loch disse...

apartir de suas função fiz uma generica para CPF e CNPJ

---Alterada por Amaro José Loch
---Email - tgb.amaro@gmail.com
---13/10/2011


CREATE OR REPLACE FUNCTION CPF_CNPJ(par_cpf varchar(14)) RETURNS varchar(18) AS $$
BEGIN
IF char_length(par_cpf) = 11 THEN
RETURN substring(par_cpf FROM 1 FOR 3) || '.' || substring(par_cpf FROM 4 FOR 3) || '.' || substring(par_cpf FROM 7 FOR 3) || '-' || substring(par_cpf FROM 10 FOR 2);
else
IF char_length(par_cpf) = 14 THEN
RETURN substring(par_cpf FROM 1 FOR 2) || '.' ||
substring(par_cpf FROM 3 FOR 3) || '.' ||
substring(par_cpf FROM 6 FOR 3) || '/' ||
substring(par_cpf FROM 9 FOR 4) || '-' ||
substring(par_cpf FROM 13 FOR 2);
else
Return ' ';
END IF;
END IF;



END;
$$ LANGUAGE PLPGSQL;

Amaro José Loch disse...

Aproveitando sua ideia fiz uma alteração

---Alterada por Amaro José Loch
---Email - tgb.amaro@gmail.com
---13/10/2011


CREATE OR REPLACE FUNCTION CPF_CNPJ(par_cpf varchar(14)) RETURNS varchar(18) AS $$
BEGIN
IF char_length(par_cpf) = 11 THEN
RETURN substring(par_cpf FROM 1 FOR 3) || '.' || substring(par_cpf FROM 4 FOR 3) || '.' || substring(par_cpf FROM 7 FOR 3) || '-' || substring(par_cpf FROM 10 FOR 2);
else
IF char_length(par_cpf) = 14 THEN
RETURN substring(par_cpf FROM 1 FOR 2) || '.' ||
substring(par_cpf FROM 3 FOR 3) || '.' ||
substring(par_cpf FROM 6 FOR 3) || '/' ||
substring(par_cpf FROM 9 FOR 4) || '-' ||
substring(par_cpf FROM 13 FOR 2);
else
Return ' ';
END IF;
END IF;



END;
$$ LANGUAGE PLPGSQL;

Anônimo disse...

A partir de tudo isso, fiz uma função ainda mais genérica para formatação de CPF, levando em consideração que a entrada já pode estar formatada (e, ainda assim, mal formatada)

CREATE OR REPLACE FUNCTION cpf( p_cpf VARCHAR(14) ) RETURNS VARCHAR AS $$
DECLARE
v_cpf VARCHAR;
BEGIN
v_cpf = regexp_replace( p_cpf, '[^0-9]', '', 'g' );
RETURN substring( v_cpf FROM 1 FOR 3 ) || '.' ||
substring( v_cpf FROM 4 FOR 3 ) || '.' ||
substring( v_cpf FROM 7 FOR 3 ) || '-' ||
substring( v_cpf FROM 10 FOR 2 );
END;
$$ LANGUAGE 'plpgsql';