Ir al contenido


Foto

Funcion para insertar subcadena


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

#1 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 septiembre 2010 - 05:08

Hola a todos comunidad,

Les comparto un código que ayuda a insertar una subcadena en una cadena en cada una de n número de posiciones definidas mediante un arreglo...

Ojalá les sirva y claro que se aceptan sugerencias y mejoras....  (y)

Saludox ! :)



delphi
  1. function InsertaSubCadena(Cadena, Simbolo: String; Posicion: Array of Integer): String;
  2. var
  3.   sTemp, sDerecha, sIzquierda: String;
  4.   i, iTamano: Integer;
  5. begin
  6.     sTemp:= Cadena;
  7.  
  8.     for i := 0 to Length(Posicion) - 1 do
  9.     begin
  10.       sIzquierda := AnsiMidStr(sTemp,1,((Posicion[i]+i)-1));
  11.       iTamano := Length(sTemp);
  12.       sDerecha := AnsiRightStr(sTemp,(iTamano-(Posicion[i]+I))+1);
  13.  
  14.       sTemp := sIzquierda+Simbolo+sDerecha;
  15.     end;
  16.     Result := sTemp;
  17. end;



Y se usa de la siguiente manera:



delphi
  1.   Label.Caption := InsertaSubCadena('DELPHIACCESS.COM','-',[2,3,5,7]);



Resultado:  D-E-LP-HI-ACCESS.COM





  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 14 septiembre 2010 - 12:07

Buenas,

Sólo una pequeña mejora para controlar que la posición no esté más allá que la longitud de la cadena dada ya que no terminaba de hacerlo correctamente en ese caso



delphi
  1. function InsertaSubCadena(Cadena, Simbolo: String; Posicion: Array of Integer): String;
  2. var
  3.   sTemp, sDerecha, sIzquierda: String;
  4.   i, iTamano: Integer;
  5. begin
  6.     sTemp:= Cadena;
  7.  
  8.     for i := 0 to High(Posicion) do
  9.     begin
  10.       if Posicion[i] > Length(Cadena) then Continue;
  11.  
  12.       sIzquierda := AnsiMidStr(sTemp,1,((Posicion[i]+i)-1));
  13.       iTamano := Length(sTemp);
  14.       sDerecha := AnsiRightStr(sTemp,(iTamano-(Posicion[i]+I))+1);
  15.  
  16.       sTemp := sIzquierda+Simbolo+sDerecha;
  17.     end;
  18.     Result := sTemp;
  19. end;



Otra posible mejora sería hacer una ordenación previa de la lista de posiciones por si la pasan desordenada. También he substituido el Length(Posicion) - 1 por un High(Posicion), pero esto ya es más cuestión de gustos personales :)

Nos leemos

  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 14 septiembre 2010 - 02:55

Yo lo haria asi:



delphi
  1. function InsertaSubCadena(Cadena, Simbolo: String; Posicion: Array of Integer): String;
  2. var
  3.   i: Integer;
  4. begin
  5.   Result:= Cadena;
  6.   for i:= High(Posicion) downto Low(Posicion) do
  7.     insert(Simbolo,Result,Posicion[i]);
  8. end;



Aunque como ya dijo cadetill, primero habría que hacer una ordenación de las posiciones para asegurarse que van de menor a mayor.

PD: Lo de "Low" también es una manía personal  ;)
  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 14 septiembre 2010 - 03:07

Buenas,

Efectivamente amigo seoane, esa es la manera en que lo había pensado, pero como podría darse el caso de que los elementos vinieran desordenados ya no lo plantee ;)

Nos leemos

  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 14 septiembre 2010 - 03:20

Buenas,

Efectivamente amigo seoane, esa es la manera en que lo había pensado, pero como podría darse el caso de que los elementos vinieran desordenados ya no lo plantee ;)

Nos leemos


Si el array viene desordenado, no funciona ninguna de ellas
  • 0

#6 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 14 septiembre 2010 - 03:32

Buenas,

Sí, sí, lo sé. Lo único que hice en la opción de la amiga Fenareth fue tener en cuenta que la posición no superara la longitud de la cadena, cosa que seguramente se debería de comprobar también antes de hacer el "insert" en tu caso. No lo he probado, pero quizás de algún error o no lo haga como es debido :)

Nos leemos

  • 0

#7 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 14 septiembre 2010 - 04:20

Si al insert le pasa una posición mas alta que la longitud de la cadena te lo coloca al final.

Es decir, si usamos esto:


delphi
  1. InsertaSubCadena('DELPHIACCESS.COM','-',[2,3,5,7,50,70]);



Obtenemos esto


delphi
  1. D-E-LP-HI-ACCESS.COM--



PD: Fenareth es amiga no amigo  :D
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 14 septiembre 2010 - 04:33

Si al insert le pasa una posición mas alta que la longitud de la cadena te lo coloca al final.


Perfecto pues :)

PD: Fenareth es amiga no amigo  :D


jejeje, no lo sabía, ahora mismo lo corrijo :D

Nos leemos

  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 14 septiembre 2010 - 07:32

Que bien !!!, esto de ver el estilo de cada uno es muy interesante e ilustrativo. (y)

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.