Como eu estou bonzinho hoje, resolvi escrever uma dica para os colegas da 
lista. Vamos a ela!

Frequentemente rola aqui na lista "dúvidas" sobre formatação de valores, como 
telefone e números de documentos como CPF(o antigo CIC) e CNPJ(o antigo CGC). 
Alguns colegas, de forma inadvertida, enviam "dúvidas" sobre como já trazer o 
valor formatado do banco de dados.

Pensando nos colegas que ainda possuem essas "dúvidas", e tb para auxiliar os 
demais colegas que podem passar por essa problemática, ilustro o código a 
seguir de uma aplicação console em Delphi que mostra algumas funções que 
escrevi para formatação de tais valores.

<>
program TesteFormatacaoTelefone;

{$APPTYPE CONSOLE}

uses
  SysUtils, Mask;

{$R *.RES}

const
  SinalMais           = '+';
  AbreAspas           = '(';
  FechaAspas          = ')';
  HifenTraco          = '-';
  SinalPonto          = '.';

{$WRITEABLECONST ON}
  MascaraTelefone     : string = '0000\-0000;0;_';
  MascaraTelefoneDDD  : string = '\(00\)0000-0000;0;_';
  MascaraTelefoneIntl : string = '\+00\-00\-0000\-0000;0;_';

  MascaraCPF          : string = '000\.000\.000\-00;0;_';
  MascaraCNPJ         : string = '00\.000\.000\/0000\-00;0;_';
{$WRITEABLECONST OFF}

  TelefoneNulo        = '999999999999';
  CPFNulo             = '99999999999';
  CNPJNulo            = '99999999999999';

{===================== FORMATAÇÃO DE TELEFONES ==============================}

function DesformataTelefone(const s: string): string;
begin
  //  Inicializa resultado
  Result := s;

  //  Retira todos os tokens mais usados em telefones
  Result := StringReplace(Result, SinalMais,  EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, SinalPonto, EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, AbreAspas,  EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, FechaAspas, EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, HifenTraco, EmptyStr, [rfReplaceAll]);

  //  Se telefone não tem somente números, retorna telefone nulo
  if not (StrToIntDef(s, -1) = -1) then
    Result := TelefoneNulo;
end;

function FormataTelefone(const s: string): string;
begin
  Result := DesformataTelefone(s);
  if Length(Result)> 10 then
    Result := FormatMaskText(MascaraTelefoneIntl, s)
  else if Length(Result)> 8 then
    Result := FormatMaskText(MascaraTelefoneDDD, s)
  else if Length(Result) = 8 then
    Result := FormatMaskText(MascaraTelefone, s);
end;


{===================== FORMATAÇÃO DE CPFs e CNPJs ===========================}

function DesformataCPF(UmCPF: string): string;
begin
  Result := UmCPF;
  Result := StringReplace(Result, '.', EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, '-', EmptyStr, [rfReplaceAll]);
end;

function DesformataCNPJ(UmCNPJ: string): string;
begin
  Result := UmCNPJ;
  Result := StringReplace(Result, '.', EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, '-', EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, '/', EmptyStr, [rfReplaceAll]);
end;

function FormataCPF(UmCPF: string): string;
begin
  if (Length(UmCPF) = 11) and (not (StrToInt64Def(UmCPF, -1) = -1)) then
    Result := FormatMaskText(MascaraCPF, DesformataCPF(UmCPF))
end;

function FormataCNPJ(UmCNPJ: string): string;
begin
  if (Length(UmCNPJ) = 14) and (not (StrToInt64Def(UmCNPJ, -1) = -1)) then
    Result := FormatMaskText(MascaraCNPJ, DesformataCNPJ(UmCNPJ))
end;


var
  sTelefone, sCPF, sCNPJ: string;

begin
  sTelefone := '22334455';
  WriteLn('Telefone normal');
  WriteLn('---------------');
  WriteLn(sTelefone);

  sTelefone := FormataTelefone(sTelefone);
  WriteLn(sTelefone);

  sTelefone := DesformataTelefone(sTelefone);
  WriteLn(sTelefone);

  WriteLn;

  sTelefone := '9222334455';
  WriteLn('Telefone com DDD');
  WriteLn('----------------');
  WriteLn(sTelefone);

  sTelefone := FormataTelefone(sTelefone);
  WriteLn(sTelefone);

  sTelefone := DesformataTelefone(sTelefone);
  WriteLn(sTelefone);

  WriteLn;


  sTelefone := '559222334455';
  WriteLn('Telefone internacional');
  WriteLn('----------------------');
  WriteLn(sTelefone);

  sTelefone := FormataTelefone(sTelefone);
  WriteLn(sTelefone);

  sTelefone := DesformataTelefone(sTelefone);
  WriteLn(sTelefone);


  sCNPJ := '54698741000123';
  sCPF := '69425812366';

  WriteLn;
  WriteLn('CPF e CNPJ (fictícios)');
  WriteLn('----------------------');

  WriteLn(Format('%s = %s', [sCPF, FormataCPF(sCPF)]));
  WriteLn(Format('%s = %s', [sCNPJ, FormataCNPJ(sCNPJ)]));

  WriteLn;
  WriteLn('Pressione ENTER...');
  WriteLn(Eoln);
end.
<>

Sempre o mais coerente é tratar o dado como ele vem das consultas SQL, pois o 
tratamento da formatação e exibição desses dados cabe sempre ao software 
front-end, ou seja, sua aplicação Delphi.

Vamos supor que vc tem uma aplicação rudimentar em Delphi que faça uso de data 
modules para organizar os datasets. Um destes datasets é uma consulta que 
retorna, dentre outras informações, o CPF do cliente para uma suposta consulta 
para análise de crédito. O dado é armazenado em uma tabela sem a formatação 
habitual aplicada ao CPF. No respectiva tabela, o campo que armazena o CPF está 
definido como VARCHAR(11). Como fazer com que o campo apareça devidamente 
formatado em um controle data-aware, como um TDBGrid?

Usando a função FormataCPF() anteriormente mostrada na aplicação do tipo 
Console anterior, podemos codificar o evento OnGetText() do objeto TField deste 
campo e aplicar a formatação, da seguinte forma:

procedure TdmDados.sqlClienteCpfCliGetText(Sender: TField; var Text: String; 
DisplayText: Boolean);
begin
  if DisplayText then
    Text := FormataCPF(Sender.AsString)
  else
    Text := Sender.AsString;
end;


That's all, folks!

Sds.,
Rubem Rocha
Manaus, AM

_________________________________________________________________
Cansado de espaço para só 50 fotos? Conheça o Spaces, o site de relacionamentos 
com até 6,000 fotos!
http://www.amigosdomessenger.com.br

Responder a