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