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 30-11-2010
McK McK is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 33
Poder: 0
McK Va por buen camino
Sacar números de cadenas de caracteres.

Parece una pregunta un tanto tonta, ya que con 2 bucles for y recorriéndola se puede hacer, pero me preguntaba si pudiera existir alguna función en delphi que sea más efectiva y menos medieval para hacerlo.

Como ejemplo, lo que quiero hacer es sacar los numeros que vienen detras de unas letras concretas en una cadena de caracteres:

DHS274HGL23JH41234HGL412YG

Las letras concretas aquí (p.e.) serían HGL. Por lo que los números que en este caso necesitaría sacar y guardar son el 23 y el 412.

Un saludo y gracias!
Responder Con Cita
  #2  
Antiguo 30-11-2010
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Si mantiene la posición puedes utilizar Copy

Código Delphi [-]
xx:=Copy(Cadena,4,3);


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 30-11-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.297
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Pues a mi sólo se me ocurre con 2 bucles.
El primero para encontrar y recorrer las ocurrencias de la cadena buscada (suponiendo que hay varias) y el segundo para extraer los números antes de la csiguiente letra (que por lo que veo pueden tener longitud indeterminada).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 30-11-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
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.

Última edición por ecfisa fecha: 30-11-2010 a las 19:23:55.
Responder Con Cita
  #5  
Antiguo 01-12-2010
Avatar de Estifmauin
Estifmauin Estifmauin is offline
Miembro
 
Registrado: may 2008
Ubicación: Alicante
Posts: 24
Poder: 0
Estifmauin Va por buen camino
Otro enfoque, más legible, pero creo que menos eficiente:

Código Delphi [-]
function SoloNumeros(s:string):string;
var
  n :integer;
begin
  result:='';
  n:=1;
  while (n <= Length(s))
  and (s[n] in ['0'..'9']) do begin
    result:=result+s[n];
    Inc(n);
  end;
end;

function ExtraerNumeros(cadena, prefijo :string) :TStrings;
var
  i :integer;
begin
  result:=TStringList.Create;
  result.CommaText:=StringReplace(cadena,prefijo,',',[rfReplaceAll]);
  for i:=result.Count -1 downto 0 do begin
    result[i]:=SoloNumeros(result[i]);
    if result[i] = '' then result.Delete(i);
  end;
end;
Para llamarlo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Lines:=ExtraerNumeros('HGL44DHS274HGL23JHGL41234HGL412YGHGL555XADSF1AHG12HGL999','HGL');
end;
Es más legible, pero insisto en que menos eficiente, y requiere uses StrUtils
Responder Con Cita
  #6  
Antiguo 01-12-2010
McK McK is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 33
Poder: 0
McK Va por buen camino
Perfecto, gracias a todos. Aunque no haya una instrucción de Delphi eso está bastante simplificado. Yo lo tenía algo peor implementado.

Un saludo!
Responder Con Cita
  #7  
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
  #8  
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
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 18:34:27.


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