Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eliminar subcadena de una cadena (https://www.clubdelphi.com/foros/showthread.php?t=45612)

kuan-yiu 09-07-2007 13:30:07

Eliminar subcadena de una cadena
 
Hola a tod@s y gracias por adelantado por vuestro tiempo.

¿Alguien sabe si existe una función que elimine una subcadena de un string? El problema es que no conozco la posición exacta de la subcadena, tan sólo que está a la derecha de un determinado caracter y a la izquierda del número.

La cuestión es que tengo un código de factura similar a este: SLS_F/000105 y necesito transformalo en SLS_F/105
¿Existe alguna rutina que haga esta transformación directamente?

Ya sé que existen varias funciones de manejo de strings con las que puedo construir este procedimiento pero me gustaría saber si existe un método directo.

seoane 09-07-2007 14:01:53

Pues no conozco ninguna función que se ajuste a lo que pides. Aunque últimamente delphi trae funciones para todo, lo malo es encontrarlas.

Pero lo que si puedo es dejártelo en 2 instrucciones :p :
Código Delphi [-]
function QuitaCeros(Str: String): String;
begin
  while pos('/0',Str) > 0 do
    delete(Str,pos('/0',Str)+1,1);
  Result:= Str
end;

// Por ejemplo
ShowMessage(QuitaCeros('SLS_F/000105'));

Neftali [Germán.Estévez] 09-07-2007 14:22:35

Yo uso el Replace (AnsiReplaceText, AnsiReplaceStr) utilizando la cadena vacía. La admite sin problemas.
Te funciona para todas las ocurrencias de la cadena que quieras eliminar.

seoane 09-07-2007 14:25:17

Cita:

Empezado por Neftali
Yo uso el Replace (AnsiReplaceText, AnsiReplaceStr) utilizando la cadena vacía. La admite sin problemas.
Te funciona para todas las ocurrencias de la cadena que quieras eliminar.

Pero según lo entiendo yo, no quiere eliminar todos los ceros, solo los que se encuentran entre la barra y la primera cifra significativa.

seoane 09-07-2007 14:34:03

Y solo por fastidiar :p , te dejo este otro mas largo, pero creo que mas rápido:
Código Delphi [-]
function Quitar0(Source: PChar; Dest: PChar): Integer;
asm
        MOV     Result,0
        DEC     EAX
@@SIG1:
        INC     EAX
        CMP     BYTE PTR [EAX],0
        JE      @@SALIR
        MOV     CL,[EAX]
        CMP     CL,'/'
        JE      @@SIG2
        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
        JMP     @@SIG1
@@SIG2:
        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
@@SIG3:
        INC     EAX
        CMP     BYTE PTR [EAX],0
        JE      @@SALIR
        MOV     CL,[EAX]
        CMP     CL,'0'
        JE      @@SIG3

        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
@@SIG4:
        INC     EAX
        CMP     BYTE PTR [EAX],0
        JE      @@SALIR
        MOV     CL,[EAX]
        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
        JMP     @@SIG4
@@SALIR:
        MOV     BYTE PTR [EDX],0
end;

Por ejemplo:
Código Delphi [-]
var
  Str: String;
begin
  Str:= Copy('SLS_F/000105',1,MAXINT);
  Quitar0(PChar(Str),PChar(Str));
  ShowMessage(Str);
end;

:D que forma de perder el tiempo ...

marcoszorrilla 09-07-2007 14:34:10

Algo así igual también pueda valerte:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=StringReplace(Edit1.Text,'/000','/',[rfReplaceAll]);
end;

Un Saludo.

Bicho 09-07-2007 15:19:02

Cita:

Empezado por seoane
Y solo por fastidiar :p , te dejo este otro mas largo, pero creo que mas rápido:
Código Delphi [-]
function Quitar0(Source: PChar; Dest: PChar): Integer;
asm
        MOV     Result,0
        DEC     EAX
@@SIG1:
        INC     EAX
        CMP     BYTE PTR [EAX],0
        JE      @@SALIR
        MOV     CL,[EAX]
        CMP     CL,'/'
        JE      @@SIG2
        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
        JMP     @@SIG1
@@SIG2:
        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
@@SIG3:
        INC     EAX
        CMP     BYTE PTR [EAX],0
        JE      @@SALIR
        MOV     CL,[EAX]
        CMP     CL,'0'
        JE      @@SIG3

        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
@@SIG4:
        INC     EAX
        CMP     BYTE PTR [EAX],0
        JE      @@SALIR
        MOV     CL,[EAX]
        MOV     BYTE PTR [EDX],CL
        INC     EDX
        INC     Result
        JMP     @@SIG4
@@SALIR:
        MOV     BYTE PTR [EDX],0
end;

Por ejemplo:
Código Delphi [-]
var
  Str: String;
begin
  Str:= Copy('SLS_F/000105',1,MAXINT);
  Quitar0(PChar(Str),PChar(Str));
  ShowMessage(Str);
end;

:D que forma de perder el tiempo ...


Es increible la de tiempo que tienen algunos!! :D

Saludos

seoane 09-07-2007 15:28:28

Cita:

Empezado por Bicho
Es increible la de tiempo que tienen algunos!! :D

Pues la verdad es que tengo un montón de trabajo que hacer, pero como digo debajo de mi nombre, me dedico a procrastinar :p :D

Neftali [Germán.Estévez] 09-07-2007 16:35:33

Cita:

Empezado por seoane
solo los que se encuentran entre la barra y la primera cifra significativa.

En este caso sería por si fuera útil buscar 000.
Si és sólo para discriminar algunos, como tú comentas, está claro que no es útil.

kuan-yiu 09-07-2007 16:50:49

Gracias a todos por vuestras respuestas, jejeje, me habéis alegrado la tarde (pensé que nadie respondería porque estaba preguntando una trivialidad).

Aclaraciones:
* No me vale el "replace" porque eliminaría todos los ceros y algunos de ellos los necesito.
* Creo que pasaré de la versión larga del algoritmo... prefiero código que dentro de 6 meses pueda entender sin un manual (aunque tampoco puedo decir que lo entienda en este momento).
* Las facturas actualmente tienen 2 ó 3 dígitos, así que el número de ceros es de 4 ó 3, pero nada me garantiza que no lleguemos a la factura 1000, así que prefiero un método más elegante que el de ensayo-error (aunque me conozco y seguro que acabaré haciendo algo así, aunque me sentiré muy culpable por hacerlo).


La franja horaria es GMT +2. Ahora son las 21:46:36.

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