DesFormatar String

Delphi

12/11/2003

Caros colegas, como faço para tirar a formatação de uma string por exemplo: uma string de cpf cpf:=´01.123.456/0001-40´ transformar em ´01123456000140´

Dede ja agradeço.

Lucas.


Lucas_rp

Lucas_rp

Curtidas 0

Respostas

Lucas Silva

Lucas Silva

12/11/2003

Acredito que a máscara do seu campo deve estar assim
´99\.999\.999\/9999\-99;1;_´... se for isso mesmo é só trocar a máscara p/ ´99\.999\.999\/9999\-99;0;_´...

se não resolver vc me dá o toque que tem outros jeitos....


GOSTEI 0
Lucas_rp

Lucas_rp

12/11/2003

Na verdade não estou usando maskedit, no arquivo ja esta gravado com a formatação então eu iria pegar o conteudo numa var do tipo string e depois eu ia tentar desformatar. Ex.:

cpf := tbcliente.fieldbyname(´cpf´).asstring;
//aqui o conteudo da cpf é ´01.123.456/0001-40´

agora que eu iria tentar desformatar, mas não sei como.

Lucas.


GOSTEI 0
Cebikyn

Cebikyn

12/11/2003

Pode usar o seguinte código:

var
  x  : integer;
  str: String;
begin
  // Edit1 contém o texto formatado:
  str := Edit1.Text;

  while Pos(´.´, Str) <> 0 do begin
    X := Pos(´.´, Str);
    Delete(Str, X, 1);
  end;

  while Pos(´-´, Str) <> 0 do begin
    X := Pos(´-´, Str);
    Delete(Str, X, 1);
  end;

  while Pos(´/´, Str) <> 0 do begin
    X := Pos(´/´, Str);
    Delete(Str, X, 1);
  end;

  // Edit2 conterá o texto sem formatação:
  Edit2.Text := Str;
end;



GOSTEI 0
Carlos Bernardo

Carlos Bernardo

12/11/2003

Você pode criar essa função:

function DeleteChar(const Ch: Char; const S: string): string;
var
Posicao: integer;
begin
Result := S;
Posicao := Pos(Ch, Result);
while Posicao > 0 do begin
Delete(Result, Posicao, 1);
Posicao := Pos(Ch, Result);
end;
end;

e depois é só usá-la assim :

Edit1.Text := DeleteChar(´-´,Edit1.Text);
Edit1.Text := DeleteChar(´.´,Edit1.Text);
Edit1.Text := DeleteChar(´/´,Edit1.Text);


GOSTEI 0
Carlosrm

Carlosrm

12/11/2003

lucas_rp

Só para aumentar as opções, vai mais uma:

procedure.....
var
I : Integer;
s : string;
begin
cpf := ´01.234.567/0001-89´;
s := emptystr;

for I := 1 to length(cpf) do
if (cpf[I] in [´0´..´9´]) then
s := s + cpf[I];

cpf := s; // ´01234567000189´
end;

abraço. carlosrm :wink:


GOSTEI 0
Beppe

Beppe

12/11/2003

Putz, abriu concurso de funções? Então aí vai a minha:

function UnformatString(const S: String): String;

  function UnformatBuffer(Dest, Source: PChar; Len: Integer): Integer;
  asm
        push    ebx
        push    eax

        jmp     @Check
  @Loop:
        mov     bl, [edx]
        inc     edx
        cmp     bl, ´0´
        jb      @Skip
        cmp     bl, ´9´
        ja      @Skip
        mov     [eax], bl
        inc     eax
  @Skip:
  @Check:
        dec     ecx
        jns     @Loop

        pop     edx
        sub     eax, edx
        pop     ebx
  end;

begin
  SetLength(Result, Length(S));
  SetLength(Result, UnformatBuffer(Pointer(Result), Pointer(S), Length(S)));
end;



GOSTEI 0
Cabelo

Cabelo

12/11/2003

Aqui vai uma mais simples e mais rápida.

Com a mesma variável string que vc usa, faça assim

cpf := stringreplace(tbcliente.fieldbyname(´cpf´).asstring, ´.´, ´´, [rfReplaceAll]);
cpf := stringreplace(tbcliente.fieldbyname(´cpf´).asstring, ´/´, ´´, [rfReplaceAll]);
cpf := stringreplace(tbcliente.fieldbyname(´cpf´).asstring, ´-´, ´´, [rfReplaceAll]);

vai que dá certo, é mais rápido, pois utiliza uma função do Delphi.

Sem mais

Cabelo 8)


GOSTEI 0
Beppe

Beppe

12/11/2003

vai que dá certo, é mais rápido, pois utiliza uma função do Delphi.


Isto não quer dizer nada. E isso pode ser mais rápido de digitar, mas em runtime é pelo menos umas 50 vezes mais lenta que a minha(eu acho que é isso que importa).


GOSTEI 0
Host

Host

12/11/2003

O Ataliba tem razão!!


GOSTEI 0
POSTAR