Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-10-2015
Nasca Nasca is offline
Miembro
 
Registrado: abr 2007
Ubicación: Almería (España)
Posts: 249
Poder: 20
Nasca Va por buen camino
Yo tengo esto:

Código Delphi [-]
function BorrarMultiEspacios(valor: string): string;
 begin
   repeat
       valor := StringReplace(valor,'  ',' ',[rfReplaceAll]);
   until
       pos('  ',valor) = 0 ;
   Result := valor;    
 end;

Ni idea de si es lo más optimo. De hecho ni recuerdo si es mio o lo copié de algún lado.
Otra opción en:
http://texthandler.com/?module=remov..._spaces_delphi
Aunque no creo que sea mucho mas eficiente.

O adaptar este código de c#, bastante similar al mío:

Código:
    while (text.IndexOf("  ") != -1)
    {
        text = text.Replace("  ", " ");
    }
    return text;
Aunque hace básicamente lo mismo y no creo que sea mucho más eficiente que el primero.
Responder Con Cita
  #2  
Antiguo 12-10-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver si ésta (recorre una sóla vez la cadena):

Código Delphi [-]
function ComprimeEspacios(S: String): String;
var
  I: Integer;

begin
  I := 1;

  while I <= Length(S) do
  begin
    while (I <= Length(S)) and (S[i] <> ' ') do
      Inc(I);

    Inc(I);

    while (I <= Length(S)) and (S[i] = ' ') do
      Delete(S, I, 1);

    Inc(I);
  end;

  Result := S;
end;

// Saludos
Responder Con Cita
  #3  
Antiguo 12-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Otra opción:
Código Delphi [-]
function DeleteExtraSpaces(str: string): string;
var
  i: integer;
begin
  for i := 1 to Length(str)-1 do
    while (str[i] = ' ') and (str[i+1] = ' ') do
      Delete(str, i+1, 1);
  Result := str;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 13-10-2015
sonjeux sonjeux is offline
Miembro
 
Registrado: jul 2004
Posts: 60
Poder: 23
sonjeux Va por buen camino
Muchas gracias a todos, me sirvio un moton
Responder Con Cita
  #5  
Antiguo 13-10-2015
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Esa es una forma destructiva (borrando). Otra manera es construir una nueva cadena, y cuando hay un espacio agregar el primero e ignorar los que vengan.
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 14-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por mamcx Ver Mensaje
Esa es una forma destructiva (borrando). Otra manera es construir una nueva cadena, y cuando hay un espacio agregar el primero e ignorar los que vengan.
Si, tenes razón... y con seguridad es mas eficiente al omitir la llamada a la función Delete:

Código Delphi [-]
function IgnoreExtraSpaces(str: string): string;
var
  i: integer;
begin
  SetLength(str, Length(str)+1);
  for i := 1 to Length(str)-1 do
    if (str[i] <> ' ') or (str[i+1] <> ' ') then
      Result := Result + str[i];
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 14-10-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola ecfisa,

Esta última versión se ve mucho mejor pero me queda la duda de si no falla cuando la cadena termina en espacios. Por otro lado, no entiendo el uso de SetLength.

pd: buena observación de mamcx, ya que borrar un caracter implica el reacomodo del resto de la cadena.

// Saludos
Responder Con Cita
  #8  
Antiguo 14-10-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Otra opcion, esta vez en asm:
Código Delphi [-]
function BorraMultiespacios(S: String): String;
var
  Cadena: PCHAR;
begin
  Cadena:= @S[1];
  asm
  mov       edi, Cadena
  mov       esi, edi
@loop1:
  cmp       word ptr [esi], 2020h
  jne       @sigue
  inc       esi
  jmp       @loop1
@sigue:
  movsb
  cmp       byte ptr [esi], 0
  jne       @loop1
  mov       word ptr [edi], 0h
  end;
  Result:= Cadena;
end;

Saludos.
Responder Con Cita
  #9  
Antiguo 14-10-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por escafandra Ver Mensaje
Otra opcion, esta vez en asm:
Código Delphi [-]
function BorraMultiespacios(S: String): String;
var
  Cadena: PCHAR;
begin
  Cadena:= @S[1];
  asm
  mov       edi, Cadena
  mov       esi, edi
@loop1:
  cmp       word ptr [esi], 2020h
  jne       @sigue
  inc       esi
  jmp       @loop1
@sigue:
  movsb
  cmp       byte ptr [esi], 0
  jne       @loop1
  mov       word ptr [edi], 0h
  end;
  Result:= Cadena;
end;

Saludos.
¡Joder! Sí que rizamos el rizo Seguro que así es lo más eficiente.

// Saludos
Responder Con Cita
  #10  
Antiguo 14-10-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.678
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
¡Joder! Sí que rizamos el rizo Seguro que así es lo más eficiente.
// Saludos
Habría que comprobarlo, lo mismo el compilador de delphi crea un código similar con alguna de las propuestas anteriores
¿Alguien se anima a probar y calcular el tiempo con cada opción?
Responder Con Cita
  #11  
Antiguo 14-10-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Habría que comprobarlo, lo mismo el compilador de delphi crea un código similar con alguna de las propuestas anteriores
Quién sabe. La misma RTL implementa algunas cosas en ensamblador. Sobre todo las que tienen que ver con el recorrido de cadenas.

Por otra parte, si usa una versión de Delphi que tenga expresiones regulares yo las usaría sin pestañear Por ejemplo, en php:

Código PHP:
function comprimeEspacios($s) {
  return 
preg_replace('/ +/'' '$s);

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cómo quitar espacios inicial y final en cadena bulc Varios 0 22-03-2014 18:24:33
Quitar Espacios en Sql El_Perrito Firebird e Interbase 3 25-02-2005 12:49:12
Quitar espacios al final de una cadena gescoto99 SQL 1 04-08-2004 00:02:43
Quitar espacios de campos CHAR cartmanrules Firebird e Interbase 3 22-07-2004 10:53:06
Quitar espacios en blanco Javier_A OOP 3 09-06-2004 10:29:27


La franja horaria es GMT +2. Ahora son las 03:49:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi