Separer les mots d'un string, sans les couper

Separer les mots d'un string, sans les couper - Delphi/Pascal - Programmation

Marsh Posté le 19-03-2008 à 16:49:52    

Bonjour,  
 
Je cherche a splitter un sting en fonction de sa longeur par rapport aux champs destinataires.  
 
En gros, il s'agit d'un montant en lettre du genre  :
"Dix mille six cent vingt euros et trente centimes"
que j'aimerai , en fonction de la longeur pouvoir repartir sans couper les mots sur un ou deux champ .  
Si mon champ 1 fait 25car, cela amene par ex a couper "euros" en plein milieu.  
Dans ce ce cas, ce mot doit donc aller dans le champ 2 avec la suite du string .  
 
Et la, je bloque !! Mon experience est quand meme limitée !!  
J'utilise Delphi6 Pro, et merci d'avance a ceux qui pourrait me donner un debut de piste, simple et efficace poiur y arriver.  
 

Reply

Marsh Posté le 19-03-2008 à 16:49:52   

Reply

Marsh Posté le 19-03-2008 à 19:56:33    

Salut
 
une idée:
 
-tu choppe la taille du string ->slip
-tu calcule la division par deux du length de slip ->moitié
-tu fais une boucle (for i:=1 to length(slip)) qui parcours chaque char de slip
à chaque espaces avant moitié, t'enregistre sa position (i)->lastspace (t'arrète d'enregistrer après biensur  :D )  
arrivé au milieu (donc if i >= moitié) bah si c'est un espace youpiii tu coupe, si c'est pas un espace, tu coupe au niveau de lastspace et tu choppe le reste de slip avec un length(slip)-lastpace :)
 
après faut voir la taille maxi de chaque champ à l'arrivée
 
j'èspère que c'est à peu près clair ce que je veut te dire [:barthaliastoxik]


Message édité par Flagad'aware le 19-03-2008 à 19:57:29
Reply

Marsh Posté le 20-03-2008 à 13:52:16    

je vais essayer ca, d'autres idées ?

Reply

Marsh Posté le 21-03-2008 à 09:23:52    

Tu pourrais expliquer un peu plus? ca marche pas comme j'esperaiu, ou je m'y suis mal pris (c'est sans doute le 2° cas !! )

Reply

Marsh Posté le 24-03-2008 à 21:16:49    

Salut
 
oula j'tai di des anneries...
 
-disons que ta chaine s'appèle slip
-tu calcule la division par deux du length de slip ->moitié
-tu fais une boucle:
 
for i:=1 to length(slip) do if i<= moitié then if slip[i]=' ' then lastspace:=i;
 
ça parcours chaque char de slip et , à chaque espaces avant moitié, ça enregistre sa position  
 
 
arrivé au milieu de la boucle (à toi d'ajouter le code) (donc if i >= moitié) bah si c'est un espace youpiii tu coupe en faisant:
 
champ1:=copy(slip,1,i);
 
avec ça par ex, si i=25, tu copie les 25 premiers caractères de slip dans champ1
 
puis champ2:=copy( slip, (moitié+1), (length(slip)-i) );  
 
là tu récupère toute la fin de slip
 
 
si c'est pas un espace, tu coupe au niveau de lastspace et tu choppe le reste de slip avec un length(slip)-lastpace:
 
champ1:=copy(slip,1,lastspace);
champ2:=copy( slip, (lastspace+1), (length(slip)-lastspace) );  
 
 
j'ai rien testé, y a surement certaines valeurs à décaler dans les copy mais voila le principe
 
 
si tu bloque, dis-moi où, met déja un bout de ton code et je te passerais un coup de main


Message édité par Flagad'aware le 24-03-2008 à 21:17:22
Reply

Marsh Posté le 25-03-2008 à 08:45:52    

Bon, j'ai trouvé . Sur un autre forum j'avais repeé une proc GaucheNDroite ou j'arrivais a faire ce que je voulais, mais en 2 proc, et unpeu lourd, et la solution est venue, toute bete apresn et toute simple !
Pour info, et pour servir a d'autres, voici le bout de code.En gros, ca ressemble a ce que tu suggeres, mais j'ignorais la cmd BREAK qui m'a été soufflée !!
 
  if (Length(MontantLettre)div 2) <= 35 then  
  begin  
    label5.Visible      := False;  
    label4.Visible      := True;  
    MontantLettre2.Text := MontantLettre;  
    MontantLettre1.Visible := False;  
    MontantLettre2.Visible := True;  
  end  
  else  
  begin  
      for i := 1 to Length(MontantLettre) do  
    if (copy (MontantLettre,i,1)=' ' )and (i > Length(MontantLettre)div 2) then break ;  
    MontantLettre1.Text := Copy(MontantLettre,1,i) ;  
    MontantLettre2.Text := Copy(MontantLettre,i+1,Length(MontantLettre)) ;  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed