O Delphi possui função para formatação de espaços em branco?
Amigos....
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]
[u:b005e38994][b:b005e38994]String COM Formatada[/b:b005e38994][/u:b005e38994]
Até mais galera....
[b:b005e38994][color=red:b005e38994]Editado pelo Moderador (AZ) - Inserido BBCode para facilitar a leitura[/color:b005e38994][/b:b005e38994]
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
Curtidas 0
Respostas
Janbaceiredo
09/05/2004
Obs: Enviei a mensagem mas oa pagina do Forum formatou os espaços em branco que havia na mensagem.... Entãon coloquei ______ significando o espaço em branco...
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....
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
Fabio.hc
09/05/2004
Tente assim:
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
Emerson Nascimento
09/05/2004
ou apenas:
function RemoveEspaco(sStr:String): String; begin Result := StringReplace(sStr,´ ´,´ ´,[rfReplaceAll] ); while pos(´ ´,Result) > 0 do Result := StringReplace(Result,´ ´,´ ´,[rfReplaceAll] ); end;
GOSTEI 0
Aroldo Zanela
09/05/2004
Colega,
Se eu entendi o problema, uma solução (OO) seria:
1. Criar um unit para implementar uma classe, conforme abaixo:
2. Utilizar a classe, instanciando conforme exemplo:
Desta forma, será mantido apenas um espaço em branco entre as palavras.
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
Janbaceiredo
09/05/2004
Ai Emerson e Fabio....
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
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.
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....
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
Janbaceiredo
09/05/2004
Ai Aroldo,
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.
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
Aroldo Zanela
09/05/2004
Colega,
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.
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
Allen74
09/05/2004
Olá Amigos.
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).
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
Aroldo Zanela
09/05/2004
Caro Allen,
Só ratificando! Estou de acordo.
Só ratificando! Estou de acordo.
GOSTEI 0
Emerson Nascimento
09/05/2004
janbaceiredo,
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.
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
Cebikyn
09/05/2004
Não sou nenhum especialista no assunto, mas a alternativa do [b:ffae056768]Aroldo Zanela[/b:ffae056768] é [b:ffae056768]bem melhor[/b:ffae056768] (em performance) que todas as outras!
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.
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
Beppe
09/05/2004
cebi, testa essa:
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)
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