Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-12-2010
McK McK is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 33
Poder: 0
McK Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola McK.

Estoy de acuerdo con Neftali, se necesitan dos ciclos.

Pero mas eficiente que usar dos for es:

Código Delphi [-]

function ExtractNum(Sub, Str: string): TStrings;
var
i, p: Integer;
begin
Result:= TStringList.Create;
p:= 1;
while p <> 0 do
begin
p:= Pos(Sub, Str);
if p > 0 then
begin
Inc(p, Length(Sub));
i:= 1;
while Str[p + i] in ['0'..'9'] do Inc(i);
Result.Add(Copy(Str, p, i));
Inc(p, i);
Str:= Copy(Str, p, MaxInt);
end;
end;
end;


Ejemplo de llamada:

Código Delphi [-]

procedure TForm1.Button1Click(Sender: TObject);
const
Cadena = 'HGL44DHS274HGL23JHGL41234HGL412YGHGL555XADSF1AHG12HGL999';
begin
Memo1.Lines:= ExtractNum('HGL', Cadena);
end;


Saludos.
No me está funcionando tu código amigo. Siempre me detecta el primer substring por lo que se queda en un bucle infinito..
Responder Con Cita
  #2  
Antiguo 02-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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 McK Ver Mensaje
No me está funcionando tu código amigo. Siempre me detecta el primer substring por lo que se queda en un bucle infinito..
Mi amigo, acabo de copiar y pegar el código de la función y funciona correctamente.

Te adjunto la prueba:
Código Delphi [-]
function ExtractNum(Sub, Str: string): TStrings;
var
  i, p: Integer;
begin
  Result:= TStringList.Create;
  p:= 1;
  while p <> 0 do
  begin
    p:= Pos(Sub, Str);
    if p > 0 then
    begin
      Inc(p, Length(Sub));
      i:= 1;
      while Str[p + i] in ['0'..'9'] do Inc(i);
      Result.Add(Copy(Str, p, i));
      Inc(p, i);
      Str:= Copy(Str, p, MaxInt);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  Cadena = 'XX979ASDB12XX77DT12ADSXX99199ABCXX8838xx33'; // Con la del ejemplo anterior también funciona OK
begin
  Memo1.Lines:= ExtractNum('xx', Cadena); // muestra 33
  ShowMessage('FIN');
  Memo1.Lines:= ExtractNum('', Cadena);  // no muestra nada
  ShowMessage('FIN');
  Memo1.Lines:= ExtractNum('XX', Cadena); // muestra 979, 77, 99199, 8838
  ShowMessage('FIN');
  Memo1.Lines:= ExtractNum('xy', Cadena); // no muestra nada
  ShowMessage('FIN');
end;

¿ Podrías poner un ejemplo que te dé el ciclo infinito ? Así puedo evaluarlo.

Saludos.

Última edición por ecfisa fecha: 02-12-2010 a las 12:10:37.
Responder Con Cita
  #3  
Antiguo 02-12-2010
McK McK is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 33
Poder: 0
McK Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Mi amigo, acabo de copiar y pegar el código de la función y funciona correctamente.

Te adjunto la prueba:
Código Delphi [-]function ExtractNum(Sub, Str: string): TStrings; var i, p: Integer; begin Result:= TStringList.Create; p:= 1; while p <> 0 do begin p:= Pos(Sub, Str); if p > 0 then begin Inc(p, Length(Sub)); i:= 1; while Str[p + i] in ['0'..'9'] do Inc(i); Result.Add(Copy(Str, p, i)); Inc(p, i); Str:= Copy(Str, p, MaxInt); end; end; end; procedure TForm1.Button1Click(Sender: TObject); const Cadena = 'XX979ASDB12XX77DT12ADSXX99199ABCXX8838xx33'; // Con la del ejemplo anterior también funciona OK begin Memo1.Lines:= ExtractNum('xx', Cadena); // muestra 33 ShowMessage('FIN'); Memo1.Lines:= ExtractNum('', Cadena); // no muestra nada ShowMessage('FIN'); Memo1.Lines:= ExtractNum('XX', Cadena); // muestra 979, 77, 99199, 8838 ShowMessage('FIN'); Memo1.Lines:= ExtractNum('xy', Cadena); // no muestra nada ShowMessage('FIN'); end;


¿ Podrías poner un ejemplo que te dé el ciclo infinito ? Así puedo evaluarlo.

Saludos.
Gracias compañero ya lo he arreglado con un auxiliar. No sé porque mi variable p no pasaba de la primera substring pero es tu código tal cual... con mi aux lo que hago es copiarme la cadena y a la que va encontrando las substrings las va borrando, por lo que a la fuerza tiene que coger la siguiente. Tengo Delphi 7, quizas por la versión....
Responder Con Cita
  #4  
Antiguo 02-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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 McK Ver Mensaje
Gracias compañero ya lo he arreglado con un auxiliar. No sé porque mi variable p no pasaba de la primera substring pero es tu código tal cual... con mi aux lo que hago es copiarme la cadena y a la que va encontrando las substrings las va borrando, por lo que a la fuerza tiene que coger la siguiente. Tengo Delphi 7, quizas por la versión....
Un detalle McK, si bien no me pasó lo del bucle infinito, descubrí un fallo en el código.

En la cadena anterior:
Cita:
XX979ASDB12XX77DT12ADSXX99199ABCXX8838xx33
Si usas: ExtractNum('AS', Cadena) -> te devuelve: 'B'.

Es por que inicialicé mal el contador de ocurrencias numéricas y si o sí me pone un caracter aunque no sea un número.
Hay que inicializar distinto a 'i':
Código Delphi [-]
...
  begin
      Inc(p, Length(Sub));
      //  i:= 1;      BORRAR LINEA 
      i:= 0;  // NUEVA LINEA
  ...


Un saludo.
Responder Con Cita
  #5  
Antiguo 03-12-2010
McK McK is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 33
Poder: 0
McK Va por buen camino
Thumbs up

Cita:
Empezado por ecfisa Ver Mensaje
Un detalle McK, si bien no me pasó lo del bucle infinito, descubrí un fallo en el código.

En la cadena anterior:

Si usas: ExtractNum('AS', Cadena) -> te devuelve: 'B'.

Es por que inicialicé mal el contador de ocurrencias numéricas y si o sí me pone un caracter aunque no sea un número.
Hay que inicializar distinto a 'i':
Código Delphi [-]... begin Inc(p, Length(Sub)); // i:= 1; BORRAR LINEA i:= 0; // NUEVA LINEA ...



Un saludo.
Vaaaaale ya sé lo que pasaba!!! Que despiste.... lo de i:= 0 ya me dí cuenta cuando lo depuraba..

Código:
function ExtractNum(Sub, Str: string): TStrings;
var
  i, p: Integer;
begin
  Result:= TStringList.Create;
  p:= 1;
  while p <> 0 do
  begin
    p:= Pos(Sub, Str);
    if p > 0 then
    begin
      Inc(p, Length(Sub));
      i:= 1;
      while Str[p + i] in ['0'..'9'] do Inc(i);
      Result.Add(Copy(Str, p, i));
      Inc(p, i);
      Str:= Copy(Str, p, MaxInt); // Esta línea no la había metido!!!  
    end;                          // De todas formas en mi procedure he metido esto tal cual sin crear ninguna función
  end;                            // y por no modificar mi cadena por eso he utilizado el auxiliar.
end;
Mil gracias y perdona por el mareo!!
Saludos
Responder Con Cita
Respuesta



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
sacar numeros al azar edlm Varios 20 31-05-2012 21:50:40
Odenar Cadenas con letras y números Kandorf OOP 3 20-05-2010 01:51:55
Case pero con cadenas en vez de con caracteres noob Varios 9 21-01-2009 18:56:07
Comparar cadenas y sacar su semejanza en % CamiloVI Varios 5 15-05-2008 08:27:30
Sacar los números del 1 al 9 con dos digitos David OOP 4 06-03-2008 23:08:09


La franja horaria es GMT +2. Ahora son las 17:56:15.


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