Ir al contenido



Foto

Eliminar espacios en blanco al inicio y fin de una cadena


  • Por favor identifícate para responder
6 respuestas en este tema

#1 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 05 abril 2013 - 09:19

El día de hoy vi un código publicado en Facebook que muestra una función para eliminar espacios en blanco al inicio y fin de una cadena. En un inicio me pareció irrelevante pues para ello tenemos ya la función trim pero pensandolo un poco mejor puede servir como un buen ejercicio de optimización y mejora.

Aquí el código y sientanse libres de mejorarlo u optimizarlo :)



delphi
  1. function DelSpaces(Const Search: String): String;
  2. Const BlackSpace = [#33..#126];
  3.     Var Index: Byte;
  4. Begin
  5.   Index := 1;
  6.   While (Index <= Length(Search)) and
  7.         Not (Search[Index] in BlackSpace) Do
  8.     Index := Index + 1;
  9.   result := copy(Search,Index,255);
  10.   Index := Length(Result);
  11.   While (Index >0) and
  12.         not (Result[Index] in BlackSpace) Do
  13.     Index := Index -1;
  14.   result := copy(Result,1,Index);
  15.  
  16. End;


  • 1

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.858 mensajes
  • LocationMadrid - España

Escrito 05 abril 2013 - 12:35

Propongo una 'extraña' versión:



delphi
  1. function _strrev(str: PCHAR): PCHAR; cdecl external 'crtdll';
  2. function AllTrim(S: String): String;
  3. var
  4.   i, n: integer;
  5. begin
  6.   Result:= S;
  7.   i:= Length(S);
  8.   for n:= 0 to 1 do
  9.   begin
  10.     while(i>0) and (Result[i] = ' ') do dec(i);
  11.     if i < Length(Result) then Result[i+1]:= #0;
  12.     Result := String(_strrev(PCHAR(Result)));
  13.   end;
  14. end;




Saludos.
  • 1

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 05 abril 2013 - 01:40

Me gusta, claro con rev nos ahorramos el recorrido de fin al inicio :p
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 05 abril 2013 - 03:03

La fucnión que usaste amigo me hizo pensar en una loquera. Hacer una versión recursiva...



delphi
  1. function Mi_Trim(Cadena: String): String;
  2.  
  3.   function DelFin(SubCadena: String): String;
  4.     Begin
  5.       If SubCadena[Length(SubCadena)] = ' ' Then
  6.         result := DelFin(Copy(SubCadena,1,Length(SubCadena) - 1))
  7.       else
  8.         Result := SubCadena;
  9.     End;
  10.  
  11.   function DelInicio(SubCadena: String): String;
  12.     Begin
  13.       If SubCadena[1] = ' ' Then
  14.         result := DelInicio(Copy(SubCadena,2,Length(SubCadena) - 1))
  15.       else
  16.         Result := SubCadena;
  17.     End;
  18. Begin
  19.   Result := DelInicio(DelFin(Cadena));
  20. end;





y así se usaria:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. cadena: String;
  4. begin
  5.   cadena := Mi_Trim('    .prueba.    ');
  6.   ShowMessage('-' + cadena + '-');
  7.  
  8. end;


  • 0

#5 roly

roly

    Newbie

  • Miembros
  • Pip
  • 3 mensajes
  • LocationBOLIVIA

Escrito 09 mayo 2016 - 01:33


delphi
  1. function Eliminar(cadena:String):String;
  2. begin
  3.     result:=Trim(cadena);
  4. end;


  • 1

#6 sir.dev.a.lot

sir.dev.a.lot

    Advanced Member

  • Miembros
  • PipPipPip
  • 545 mensajes
  • Location127.0.0.1

Escrito 07 julio 2016 - 03:56


delphi
  1. function Q_TrimChar(const S: string; Ch: Char): string;
  2. asm
  3. PUSH ESI
  4. MOV ESI,ECX
  5. TEST EAX,EAX
  6. JE @@qt
  7. MOV ECX,[EAX-4]
  8. TEST ECX,ECX
  9. JE @@qt
  10. PUSH EBX
  11. PUSH EDI
  12. MOV EBX,EAX
  13. MOV EDI,EDX
  14. XOR EDX,EDX
  15. MOV EAX,ESI
  16. CALL System.@LStrFromPCharLen
  17. MOV EDX,EDI
  18. MOV ECX,[EBX-4]
  19. @@lp1: CMP DL,BYTE PTR [EBX]
  20. JNE @@ex1
  21. INC EBX
  22. DEC ECX
  23. JNE @@lp1
  24. MOV EDX,[ESI]
  25. JMP @@wq
  26. @@ex1: DEC ECX
  27. @@lp2: CMP DL,BYTE PTR [EBX+ECX]
  28. JNE @@ex2
  29. DEC ECX
  30. JMP @@lp2
  31. @@ex2: MOV EDI,[ESI]
  32. LEA EDX,[EDI+ECX+1]
  33. @@lp3: MOV AL,BYTE PTR [EBX+ECX]
  34. MOV BYTE PTR [EDI+ECX],AL
  35. DEC ECX
  36. JNS @@lp3
  37. @@wq: MOV EAX,[ESI]
  38. MOV BYTE PTR [EDX],0
  39. SUB EDX,EAX
  40. MOV [EAX-4],EDX
  41. POP EDI
  42. POP EBX
  43. POP ESI
  44. RET
  45. @@qt: MOV EAX,ESI
  46. CALL System.@LStrClr
  47. POP ESI
  48. end;

Hola a todos, Me sumo al Tema, proporcionando una funcion en Ensamblador (Optimizada).

 

Probada en Delphi 7, Windows 10 PRO.

 

Ejemplo:

ShowMessage(Q_TrimChar('   HOLA MUNDO   ',#32));

 

Saludos!


  • 1

#7 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 08 julio 2016 - 08:51

Hola tambien dejo mi version


delphi
  1. function trimString(const source:String):String;
  2. var i,fpos,lpos:Integer;
  3. begin
  4. fpos:=1;
  5. lpos:=Length(source);
  6. Result:=source;
  7.  
  8. if lpos>0 then begin
  9. while source[fpos]=' ' do inc(fpos);
  10. while source[lpos]=' ' do dec(lpos);
  11. Result:=Copy(source,fpos,lpos-fpos+1);
  12. end;
  13. end;


  • 1