Categoria: Python

Manipulação de CPF e CNPJ

Ao desenvolver sistemas aqui no Brasil, muitas vezes se faz necessário trabalhar com CPF e CNPJ e armazenar estes dados em banco.

Embora os campos de entrada desta informação geralmente sejam mascarados para o tal formato (___.___.___-__ ou __.___.___/____-__), muitos desenvolvedores preferem armazenar sem os pontos, traços e barras em campos to tipo string no banco de dados. String pois alguns desses números começam com 0(zero), então se for campo integer poderá enfrentar problemas.

Depois, na hora de usar estes números, pra definir se é um CNPJ ou CPJ basta remover a máscara e fazer a contagem do length: se for 11 é CPF, se for 14 é CNPJ, e qualquer coisa diferente disso é wrong_number. ?

Por exemplo em jQuery poderia ser feito algo assim:
cpf_or_cnpj_input_value = $('#cpf_or_cnpj').val();
cpf_or_cnpj_input_value = cpf_or_cnpj_input_value.replace(/[^\d]/g, '');
switch (cpf_or_cnpj_input_value.length) {
case 11:
is_this_cpf_or_cnpj = "cpf";
break;
case 14:
is_this_cpf_or_cnpj = "cnpj";
break;
default:
is_this_cpf_or_cnpj = "wrong_number";
break;
}

Sendo que na segunda linha é usada uma expressão regular que substitui tudo o que não for dígito, por ”.
E na hora de mostrá-lo, utiliza-se um helper para exibí-lo com pontos, traços e barras, conforme o formato desejado.

Confira por exemplo como ficaria um helper para exibir um CPF fictício em linguagem ruby, usando a sintaxe de slice de array, informando o começo e quantos caracteres deseja em cada slice:

cpf.rb
>> cpf
=> "12345678977"
>> "#{cpf[0,3]}.#{cpf[3,3]}.#{cpf[6,3]}-#{cpf[9,2]}"
=> "123.456.789-77"

O mesmo helper em linguagem python. Repare que em python é diferente: você diz o começo e o fim, e não o começo e quantos caracteres quer:

cpf.py
>>> cpf
'12345678977'
>>> "{}.{}.{}-{}".format(cpf[0:3], cpf[3:6], cpf[6:9], cpf[9:11])
'123.456.789-77'

Referências: https://gist.github.com/dirceu/cc46f465f6957491827f
Greetings to: Dirceu Tiegs (https://github.com/dirceu)