PDA

Ver la Versión Completa : Eliminar subcadena de una cadena


kuan-yiu
09-07-2007, 13:30:07
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 :

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
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:

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:

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:

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

Un Saludo.

Bicho
09-07-2007, 15:19:02
Y solo por fastidiar :p , te dejo este otro mas largo, pero creo que mas rápido:

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:

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
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 (http://es.wikipedia.org/wiki/Procrastinación) :p :D

Neftali [Germán.Estévez]
09-07-2007, 16:35:33
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).