Fórum O Delphi possui função para formatação de espaços em branco? #230943
09/05/2004
0
por acaso o Delphi possui alguma função que retirei os espaços em braco a mais em uma string???
Exemplo:
[u:b005e38994][b:b005e38994]String SEM Formatação[/b:b005e38994][/u:b005e38994]
abcde fghi jlmno pqrs tuvxz 123 45 678 910
[u:b005e38994][b:b005e38994]String COM Formatada[/b:b005e38994][/u:b005e38994]
abcde fghi jlmno pqrs tuvxz 123 45 678 910
Até mais galera....
[b:b005e38994][color=red:b005e38994]Editado pelo Moderador (AZ) - Inserido BBCode para facilitar a leitura[/color:b005e38994][/b:b005e38994]
Janbaceiredo
Curtir tópico
+ 0Posts
09/05/2004
Janbaceiredo
Amigos....
por acaso o Delphi possui alguma função que retirei os espaços em braco a mais em uma string???
Exemplo:
String SEM Formatação
abcde____ fghi____jlmno___pqrs____ tuvxz_____123___45__678______910
String COM Formatada
abcde fghi jlmno pqrs tuvxz 123 45 678 910
Até mais galera....
Gostei + 0
09/05/2004
Fabio.hc
function RemoveEspaco(Str:String): String; Var x : Integer; Begin x:=0; while x <= Length(Str) do begin inc(x); if Str[x] = ´ ´ then if Str[x+1] = ´ ´ then begin Delete(str,x,1); Dec(x); end; end; Result := Str; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text:=RemoveEspaco(trim(Edit1.Text)); end;
Gostei + 0
09/05/2004
Emerson Nascimento
function RemoveEspaco(sStr:String): String; begin Result := StringReplace(sStr,´ ´,´ ´,[rfReplaceAll] ); while pos(´ ´,Result) > 0 do Result := StringReplace(Result,´ ´,´ ´,[rfReplaceAll] ); end;
Gostei + 0
09/05/2004
Aroldo Zanela
Se eu entendi o problema, uma solução (OO) seria:
1. Criar um unit para implementar uma classe, conforme abaixo:
unit Unit2;
interface
type
TFormataFrase = Class(TObject)
private
FLinhaEntrada: String;
FLinhaSaida: String;
public
property LinhaEntrada: String write FLinhaEntrada;
property LinhaSaida: String read FLinhaSaida;
procedure Execute;
procedure Clear;
end;
implementation
{ TFormataFrase }
procedure TFormataFrase.Clear;
begin
FLinhaEntrada:= ´´;
FLinhaSaida:= ´´;
end;
procedure TFormataFrase.Execute;
var Pilha: String[1];
i, x: SmallInt;
begin
Pilha := Chr(255);
FLinhaSaida := ´´; // Adicionado em 11/05/2004 - 9h
x := Length(FLinhaEntrada);
For i := 1 to x do
begin
if FLinhaEntrada[i] <> Pilha then
FLinhaSaida := FLinhaSaida + FLinhaEntrada[i];
Pilha := FLinhaEntrada[i];
end;
end;
end.2. Utilizar a classe, instanciando conforme exemplo:
procedure TForm1.Button1Click(Sender: TObject); var FormataFrase: TFormataFrase; LinhaFormatada: String; begin with TFormataFrase.Create do begin LinhaEntrada:= ´abcde fghi jlmno pqrs tuvxz 123 45 678 910´; Execute; LinhaFormatada := LinhaSaida; Free; end; end;
Desta forma, será mantido apenas um espaço em branco entre as palavras.
abcde fghi jlmno pqrs tuvxz 123 45 678 910
Gostei + 0
09/05/2004
Janbaceiredo
Valeu pela ajuda.
O Fabio fez um exemplo bem didatico e de facil compreenção.
Já o Emerson passou um exemplo um pouco mais avançado.... Por isso gostaria se possivel é claro de tirar um duvida...
No exemplo que vc passou
function RemoveEspaco2(sStr:String): String; begin Result := StringReplace(sStr,´ ´,´ ´,[rfReplaceAll] ); while pos(´ ´,Result) > 0 do Result := StringReplace(Result,´ ´,´ ´,[rfReplaceAll] ); end;
Você colocou três espaços em branco para ser procurado na função....
Alterei seu codigo e coloquei dois espaços em branco e o resultado foi igual ao mesmo codigo com tres espaços.
function RemoveEspaco2(sStr:String): String; begin Result := StringReplace(sStr,´ ´,´ ´,[rfReplaceAll] ); while pos(´ ´,Result) > 0 do Result := StringReplace(Result,´ ´,´ ´,[rfReplaceAll] ); end;
Minha duvida é:
É indiferente a quantidade de caracteres que vc coloca para ser comparado na String????
Mesmo assim agradeço novamente ao Fabio e ao Emerson pela a ajuda que vcs me deram. Ambos os exemplos funcionaram....
Valeu galera....
Gostei + 0
09/05/2004
Janbaceiredo
valeu pela sua dica tambêm....
Dá mesma forma que tive uma duvida na solução colocada pelo Emerson, tenho uma com a sua solução.....
A duvida seria:
Qual a vantagem e desvantagens em utilizar essa rotina, Orientada a Objeto com os exemplos anteriores em [b:56d96c7890]function[/b:56d96c7890](funções) dado pelo nossos amigos Fabio e Emerson????
Tem alguma diferença em velocidade de execução no processamento quando o volume de informação a ser verificado é muito alto???
Mesmo assim valeu pela ajuda, o exemplo passado por vc tambem rodou legal aqui na maquina.
Valeu mesmo,
Muito obrigado.
Gostei + 0
09/05/2004
Aroldo Zanela
A vantagem em utilizar o paradigma OO ao invés de funções estruturadas, entre outras coisas, é o encapsulamento. No que se refere a performance, acho que quem poderia avaliar a diferença de time entre as soluções apresentadas aqui é o nosso colega Fernando Allen que é especialista em qualidade de software e nosso parceiro na moderação do fórum. Vou passar uma MP à ele solicitando um parecer sobre esta thread.
Independente de performance, eu prefiro utilizar OO pois faço projetos para outras linguagens, bem como, a tendência (ou realidade atual) é a orientação à objeto. Por exemplo, para se projetar esta funcionalidade no Together (Ferramenta Case da Borland), você não escaparia de implementação OO para automatizar a fase de projeto.
Gostei + 0
09/05/2004
Allen74
Estou colhendo as informações e as soluções dadas neste tópico e posso fazer uma pequena análise de performance/arquitetura, somente para esclarecimento e efeito didático (se os autores das respostas não se importarem, é claro).
Gostei + 0
09/05/2004
Aroldo Zanela
Só ratificando! Estou de acordo.
Gostei + 0
09/05/2004
Emerson Nascimento
na verdade deveriam ser 2 espaços em branco. deve ter havido algum problema na postagem da resposta. a sua correção na função está perfeita.
Gostei + 0
10/05/2004
Cebikyn
Para um mesmo volume de dados:
função do Fabio.HC: cerca de 500ms
função do emerson.en: cerca de 1100ms
solução do Aroldo Zanela: cerca de 30ms
Agora vamos aguardar a análise do Allen74 para termos certeza.
Gostei + 0
10/05/2004
Beppe
function RemoveDupSpaces(const S: String): String; var I, Total: Integer; InHole: Boolean; begin SetLength(Result, Length(S)); Total := 0; InHole := True; for I := 1 to Length(S) do begin if not InHole or (S[I] <> ´ ´) then begin Inc(Total); Result[Total] := S[I]; end; InHole := S[I] = ´ ´; end; SetLength(Result, Total); end;
Detalhe: não testei, apenas fiz um bom teste de mesa. mAs tenho certeza que é eficiente. Trabalhando com PChar, o código ficaria uns 20¬ melhor ainda.
O que se deve evitar são as repetitivas movimentações de dados(em Delete, StringReplace e concatenação), e alocações de memória(apenas na concatenação, NESTE caso)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)