Accueil > Forum > > > > SVP : J'ai besoin d'aide ! ! !
SVP : J'ai besoin d'aide ! ! !
vendredi 27 décembre 2002 à 15:45:04 |
SVP : J'ai besoin d'aide ! ! !

Neopheus
|
Bonjour, J'ai un p'tit pb. En effet, je voudrais "transformer", dans un string, les chiffres en lettres, mais ceci dans un string qui contient en plus des chiffres des mots voir des phrases. Pour être plus explicite voici un exemple : "monsieur xxx à 3 enfants et 2 filles qui ont chacunes 10 et 14 ans" et le programme doit transformer ça en : "monsieur xxx à trois enfants et deux filles qui ont chacunes dix et quatorze ans" Bien sûr il doit faire ça quelque soit le texte, et quelque soit les nombres( et le nombre qu'il y en est...) Si quelqu'un pourrait m'aider.... Merci d'avance.... VALENTIN Xavier www.darkskull.net xavier.valentin@freesbee.fr
|
|
vendredi 27 décembre 2002 à 15:52:31 |
Re : SVP : J'ai besoin d'aide ! ! !

Neopheus
|
Pour la convertion des chiffres en lettres j'ai ces deux sources que j'ai trouvé, mais je n'arrive tjrs pas à faire mon truc..... Aidez-moi.... Voici les sources : Function TForm1.EnLettres(N:Integer):String;
Const Unite: Array[1..16] of String=('un','deux','trois','quatre','cinq','six', 'sept','huit','neuf','dix','onze','douze', 'treize','quatorze','quinze','seize'); Dizaine: Array[2..8] of String=('vingt','trente','quarante','cinquante', 'soixante','','quatre-vingt'); Coefs:Array[0..3] of String=('cent','mille','million','milliard'); Var Temp: String; C,D,U: Byte; Coef: Byte; I: Word; Neg: Boolean; begin If N = 0 then begin Result := ' Zéro'; Exit; end; Result := ''; Neg := N <0; If Neg then N := -N; Coef := 0; Repeat U := N mod 10; N := N div 10; {Récupère unité et dizaine} D := N mod 10; N := N div 10; {Récupère dizaine} If D in [1,7,9] then begin Dec(D); Inc(U, 10); end; Temp := ''; If D > 1 then begin Temp := ' ' + Dizaine[D]; If (D < 8) and ((U = 1) or (U = 11)) then Temp := Temp + ' et'; end; If U > 16 then begin Temp := Temp + ' ' + Unite[10]; Dec(U,10); end; If U > 0 then Temp := Temp + ' ' + Unite[U]; If (Result = '') and (D = 8) and (U = 0) then Result := 's'; Result := Temp + Result; C := N mod 10; N := N div 10; {Récupère centaine} If C > 0 then begin Temp := ''; If C > 1 then Temp := ' ' + Unite[C] + Temp; Temp := Temp + ' ' + Coefs[0]; If (Result = '') and (C > 1) then Result := 's'; Result := Temp + Result; end; If N > 0 then begin Inc(Coef); I := N mod 1000; If (I > 1) and (Coef > 1) then Result := 's' + Result; If I > 0 then Result := ' ' + Coefs[Coef] + Result; If (I= 1) and (Coef = 1) then Dec(N); end; until N = 0; If Neg then Result := 'Moins' + Result else Result[2] := UpCase (Result[2]); end;
|
et cette source : unit NombreToLettre;
interface
Function SommeEnChaine(Somme : Extended) : String;
const NomUnites : Array[0..19] Of String[10] = ('zéro ','un ','deux ','trois ','quatre ', 'cinq ','six ','sept ','huit ','neuf ', 'dix ','onze ','douze ','treize ','quatorze ', 'quinze ','seize ','dix-sept ','dix-huit ','dix-neuf ' ); NomDizaines : Array[0..9] Of String[13] = ('','dix ','vingt ','trente ','quarante ','cinquante ', 'soixante ','soixante-dix ','quatre-vingt ','quatre-vingt ');
NomCentaines : String[10] = 'cent'; NomMilliers : String[10] = 'mille'; NomMillions : String[10] = 'million';
LiaisonsDizainesUnites = 'et'; {trente ET un} LiaisonUnitesCentiemmes = 'et'; {neuf francs ET quarante centimes}
NomMonaie : String = 'franc'; NomCentiemme : String[10] = 'centime';
{Si vous voulez juste convertir un nombre (et pas de l'argent) il suffit de mettre LiaisonUnitesCentiemmes = 'virgule';
NomMonaie : String = ''; NomCentiemme : String[10] = '';}
implementation
Function SommeEnChaine(Somme : Extended) : String; Var Millions, Milliers, Cents : Word; Fract : Word; So : Extended; Chn : String;
Function RecuperePortion(Diviseur : Integer) : Word; Var R : Extended; DV : Extended; i : Integer;
Begin DV := 1; For i := 1 To Diviseur Do DV := DV*10; R := Trunc(So / Int(DV)); So := So - (R*Int(DV)); RecuperePortion := Trunc(R); End;
Function CentsEnChaine(C : Word;ZeroAussi : Boolean) : String; Var S : String; Ce,Di,Un : Byte; Begin CentsEnChaine := ''; S := ''; Ce := (C Div 100) Mod 10; Di := (C Div 10) Mod 10; Un := (C Mod 10); If C = 0 Then If ZeroAussi Then S := NomUnites[0] Else S := '' Else Begin If Ce > 0 Then Begin If ce > 1 Then Begin S := S + NomUnites[ce]+NomCentaines; If (Di > 0) Or (Un > 0) Then S := S + ' ' Else S := S + 's '; End Else If ce = 1 Then S := NomCentaines+' '; End; If Di > 0 Then Begin Case Di Of 1 : S := S + NomUnites[C Mod 100]; 2,3,4,5,6 : Begin S := S + NomDizaines[Di]; If Un = 1 Then S := S + LiaisonsDizainesUnites+ ' '; If Un > 0 Then S := S + NomUnites[Un]; End; 8 : Begin S := S + NomDizaines[DI]; If Un = 0 Then Insert('s',S,Length(S)) Else S := S + NomUnites[Un]; End; 7,9 : Begin S := S + NomDizaines[Di]; If Un = 1 Then S := S + LiaisonsDizainesUnites+ ' '; S := S + NomUnites[Un+10]; End; End; End Else {DI = 0 -> Pas de dizaines} Begin If Un > 0 Then S := S + NomUnites[Un]; End; End; CentsEnChaine := S; End; function SupprEspace(Str : string) : String; begin Result :=Str; while Pos(' ', result) > 0 do result := copy(result, 1, Pos(' ', result))+ copy(result, Pos(' ', result)+2, length(result)-Pos(' ', result)+2); end;
Begin SommeEnChaine := ''; Chn := ''; Somme := Abs(Somme); Fract := Round(Frac(Somme) * 100); If Fract > 99 Then Begin Fract := 0; Somme := Somme+1; End; So := Somme; Millions := RecuperePortion(6); Milliers := RecuperePortion(3); Cents := Trunc(So); If Millions > 0 Then Begin Chn := CentsEnChaine(Millions,False) + NomMillions; If Millions > 1 Then Chn := Chn + 's'; Chn := Chn + ' '; End; If Milliers > 1 Then Chn := Chn + CentsEnChaine(Milliers,False) + NomMilliers+' ' Else If Milliers = 1 Then Chn := Chn + NomMilliers+' '; Chn := Chn + CentsEnChaine(Cents,(Millions=0) And (Milliers=0)) + NomMonaie; If ((Cents > 1) or (Milliers > 1) or (Millions > 1)) and (NomMonaie <>'') and (NomMonaie[length(NomMonaie)] <>'s') Then Chn := Chn + 's'; If Fract > 0 Then Begin Chn := Chn + ' '+LiaisonUnitesCentiemmes+' ' + CentsEnChaine(Fract,False) + NomCentiemme; If (Fract > 1) and (NomCentiemme<>'') and (NomCentiemme[length(NomCentiemme)] <>'s') Then Chn := Chn + 's'; End; SommeEnChaine := SupprEspace(Chn); End;
end.
|
VALENTIN Xavier www.darkskull.net xavier.valentin@freesbee.fr ------------------------------- Réponse au message : ------------------------------- > Bonjour, > > J'ai un p'tit pb. En effet, je voudrais "transformer", dans un string, les chiffres en lettres, mais ceci dans un string qui contient en plus des chiffres des mots voir des phrases. > > Pour être plus explicite voici un exemple : > > "monsieur xxx à 3 enfants et 2 filles qui ont chacunes 10 et 14 ans" > > et le programme doit transformer ça en : > > "monsieur xxx à trois enfants et deux filles qui ont chacunes dix et quatorze ans" > > Bien sûr il doit faire ça quelque soit le texte, et quelque soit les nombres( et le nombre qu'il y en est...) > > Si quelqu'un pourrait m'aider.... > > Merci d'avance.... > > > > VALENTIN Xavier > www.darkskull.net > xavier.valentin@freesbee.fr >
|
|
vendredi 27 décembre 2002 à 16:11:00 |
Re : SVP : J'ai besoin d'aide ! ! !

Neopheus
|
Me revoilà,
Je n'ai tjrs pas trouvé : Snif !
Je tenais à préciser que les sources que je viens de mettre n'étaient pas de moi, je les ai trouvé sur le Net....
Si vous pouvez m'aider...
|
|
vendredi 27 décembre 2002 à 17:20:09 |
Re : SVP : J'ai besoin d'aide ! ! !

Amadeus
|
Ce qui te pose le plus de problème c'est de récupérer les chiffres dans ton string ('monsieur XXX à 3 enfants ...) Il faudrais que du parcours ton string caractére par carctére (boucle FOR) est que tu regarde s'il s'agit d'un numérique (if s[i] in ['0'..'9'] then) dés que tu trouve un numérique il faut que tu lise les caractères suivants pour voir s'il ne s'agit pas d'un numérique sur plusieus caractères (Ex: 23), puis tu utilise EnLettre et tu fait un stringReplace de la chaine extraite par le résultat de EnLettre. Puis tu parcours le restant de ton string pour voir s'il n'y a pas d'autres chiffres. Je ne sais pas si j'ai été clair. ------------------------------- Réponse au message : ------------------------------- > Pour la convertion des chiffres en lettres j'ai ces deux sources que j'ai trouvé, mais je n'arrive tjrs pas à faire mon truc..... > > Aidez-moi.... > > > Voici les sources : > > > Function TForm1.EnLettres(N:Integer):String; > > Const > Unite: Array[1..16] of String=('un','deux','trois','quatre','cinq','six', > 'sept','huit','neuf','dix','onze','douze', > 'treize','quatorze','quinze','seize'); > Dizaine: Array[2..8] of String=('vingt','trente','quarante','cinquante', > 'soixante','','quatre-vingt'); > Coefs:Array[0..3] of String=('cent','mille','million','milliard'); > Var > Temp: String; > C,D,U: Byte; > Coef: Byte; > I: Word; > Neg: Boolean; > begin > If N = 0 then > begin > Result := ' Zéro'; > Exit; > end; > Result := ''; > Neg := N <0; > If Neg then N := -N; > Coef := 0; > Repeat > U := N mod 10; N := N div 10; {Récupère unité et dizaine} > D := N mod 10; N := N div 10; {Récupère dizaine} > If D in [1,7,9] then > begin > Dec(D); > Inc(U, 10); > end; > Temp := ''; > If D > 1 then > begin > Temp := ' ' + Dizaine[D]; > If (D < 8) and ((U = 1) or (U = 11)) then > Temp := Temp + ' et'; > end; > If U > 16 then > begin > Temp := Temp + ' ' + Unite[10]; > Dec(U,10); > end; > If U > 0 then Temp := Temp + ' ' + Unite[U]; > If (Result = '') and (D = 8) and (U = 0) then Result := 's'; > Result := Temp + Result; > C := N mod 10; N := N div 10; {Récupère centaine} > If C > 0 then > begin > Temp := ''; > If C > 1 then Temp := ' ' + Unite[C] + Temp; > Temp := Temp + ' ' + Coefs[0]; > If (Result = '') and (C > 1) then Result := 's'; > Result := Temp + Result; > end; > If N > 0 then > begin > Inc(Coef); > I := N mod 1000; > If (I > 1) and (Coef > 1) then Result := 's' + Result; > If I > 0 then Result := ' ' + Coefs[Coef] + Result; > If (I= 1) and (Coef = 1) then Dec(N); > end; > until N = 0; > If Neg then Result := 'Moins' + Result > else > Result[2] := UpCase (Result[2]); > end; > |
> > et cette source : > > > > unit NombreToLettre; > > interface > > Function SommeEnChaine(Somme : Extended) : String; > > const > NomUnites : Array[0..19] Of String[10] > = ('zéro ','un ','deux ','trois ','quatre ', > 'cinq ','six ','sept ','huit ','neuf ', > 'dix ','onze ','douze ','treize ','quatorze ', > 'quinze ','seize ','dix-sept ','dix-huit ','dix-neuf ' > ); > NomDizaines : Array[0..9] Of String[13] > = ('','dix ','vingt ','trente ','quarante ','cinquante ', > 'soixante ','soixante-dix ','quatre-vingt ','quatre-vingt '); > > NomCentaines : String[10] = 'cent'; > NomMilliers : String[10] = 'mille'; > NomMillions : String[10] = 'million'; > > LiaisonsDizainesUnites = 'et'; {trente ET un} > LiaisonUnitesCentiemmes = 'et'; {neuf francs ET quarante centimes} > > NomMonaie : String = 'franc'; > NomCentiemme : String[10] = 'centime'; > > {Si vous voulez juste convertir un nombre (et pas de l'argent) il suffit de > mettre > LiaisonUnitesCentiemmes = 'virgule'; > > NomMonaie : String = ''; > NomCentiemme : String[10] = '';} > > implementation > > Function SommeEnChaine(Somme : Extended) : String; > Var > Millions, > Milliers, > Cents : Word; > Fract : Word; > So : Extended; > Chn : String; > > Function RecuperePortion(Diviseur : Integer) : Word; > Var > R : Extended; > DV : Extended; > i : Integer; > > Begin > DV := 1; > For i := 1 To Diviseur Do > DV := DV*10; > R := Trunc(So / Int(DV)); > So := So - (R*Int(DV)); > RecuperePortion := Trunc(R); > End; > > Function CentsEnChaine(C : Word;ZeroAussi : Boolean) : String; > Var > S : String; > Ce,Di,Un : Byte; > Begin > CentsEnChaine := ''; > S := ''; > Ce := (C Div 100) Mod 10; > Di := (C Div 10) Mod 10; > Un := (C Mod 10); > If C = 0 Then > If ZeroAussi Then S := NomUnites[0] > Else S := '' > Else > Begin > If Ce > 0 Then > Begin > If ce > 1 Then > Begin > S := S + NomUnites[ce]+NomCentaines; > If (Di > 0) Or (Un > 0) Then S := S + ' ' > Else S := S + 's '; > End > Else > If ce = 1 Then S := NomCentaines+' '; > End; > If Di > 0 Then > Begin > Case Di Of > 1 : S := S + NomUnites[C Mod 100]; > 2,3,4,5,6 > : Begin > S := S + NomDizaines[Di]; > If Un = 1 Then S := S + LiaisonsDizainesUnites+ ' '; > If Un > 0 Then S := S + NomUnites[Un]; > End; > 8 : Begin > S := S + NomDizaines[DI]; > If Un = 0 Then Insert('s',S,Length(S)) > Else S := S + NomUnites[Un]; > End; > 7,9 > : Begin > S := S + NomDizaines[Di]; > If Un = 1 Then > S := S + LiaisonsDizainesUnites+ ' '; > S := S + NomUnites[Un+10]; > End; > End; > End > Else {DI = 0 -> Pas de dizaines} > Begin > If Un > 0 Then > S := S + NomUnites[Un]; > End; > End; > CentsEnChaine := S; > End; > function SupprEspace(Str : string) : String; > begin > Result :=Str; > while Pos(' ', result) > 0 do > result := copy(result, 1, Pos(' ', result))+ > copy(result, Pos(' ', result)+2, > length(result)-Pos(' ', result)+2); > end; > > Begin > SommeEnChaine := ''; > Chn := ''; > Somme := Abs(Somme); > Fract := Round(Frac(Somme) * 100); > If Fract > 99 Then > Begin > Fract := 0; > Somme := Somme+1; > End; > So := Somme; > Millions := RecuperePortion(6); > Milliers := RecuperePortion(3); > Cents := Trunc(So); > If Millions > 0 Then > Begin > Chn := CentsEnChaine(Millions,False) + NomMillions; > If Millions > 1 Then Chn := Chn + 's'; > Chn := Chn + ' '; > End; > If Milliers > 1 Then > Chn := Chn + CentsEnChaine(Milliers,False) + NomMilliers+' ' > Else > If Milliers = 1 Then > Chn := Chn + NomMilliers+' '; > Chn := Chn + CentsEnChaine(Cents,(Millions=0) And (Milliers=0)) > + NomMonaie; > If ((Cents > 1) or (Milliers > 1) or (Millions > 1)) and (NomMonaie <>'') > and (NomMonaie[length(NomMonaie)] <>'s') Then > Chn := Chn + 's'; > If Fract > 0 Then > Begin > Chn := Chn + ' '+LiaisonUnitesCentiemmes+' ' + CentsEnChaine(Fract,False) + NomCentiemme; > If (Fract > 1) and (NomCentiemme<>'') and (NomCentiemme[length(NomCentiemme)] <>'s') Then Chn := Chn + 's'; > End; > SommeEnChaine := SupprEspace(Chn); > End; > > end. > > |
> > > VALENTIN Xavier > www.darkskull.net > xavier.valentin@freesbee.fr > > > > ------------------------------- > Réponse au message : > ------------------------------- > > > Bonjour, > > > > J'ai un p'tit pb. En effet, je voudrais "transformer", dans un string, les chiffres en lettres, mais ceci dans un string qui contient en plus des chiffres des mots voir des phrases. > > > > Pour être plus explicite voici un exemple : > > > > "monsieur xxx à 3 enfants et 2 filles qui ont chacunes 10 et 14 ans" > > > > et le programme doit transformer ça en : > > > > "monsieur xxx à trois enfants et deux filles qui ont chacunes dix et quatorze ans" > > > > Bien sûr il doit faire ça quelque soit le texte, et quelque soit les nombres( et le nombre qu'il y en est...) > > > > Si quelqu'un pourrait m'aider.... > > > > Merci d'avance.... > > > > > > > > VALENTIN Xavier > > www.darkskull.net > > xavier.valentin@freesbee.fr > > >
|
|
samedi 28 décembre 2002 à 09:33:09 |
Re : SVP : J'ai besoin d'aide ! ! !

Neopheus
|
Merci pour ta réponse, grâce à elle, j'ai réussi ! Merci encore... VALENTIN Xavier www.darkskull.net xavier.valentin@freesbee.fr ------------------------------- Réponse au message : ------------------------------- > Ce qui te pose le plus de problème c'est de récupérer les chiffres dans ton string ('monsieur XXX à 3 enfants ...) > Il faudrais que du parcours ton string caractére par carctére (boucle FOR) est que tu regarde s'il s'agit d'un numérique (if s[i] in ['0'..'9'] then) dés que tu trouve un numérique il faut que tu lise les caractères suivants pour voir s'il ne s'agit pas d'un numérique sur plusieus caractères (Ex: 23), puis tu utilise EnLettre et tu fait un stringReplace de la chaine extraite par le résultat de EnLettre. Puis tu parcours le restant de ton string pour voir s'il n'y a pas d'autres chiffres. > > Je ne sais pas si j'ai été clair. > > > ------------------------------- > Réponse au message : > ------------------------------- > > > Pour la convertion des chiffres en lettres j'ai ces deux sources que j'ai trouvé, mais je n'arrive tjrs pas à faire mon truc..... > > > > Aidez-moi.... > > > > > > Voici les sources : > > > > > > Function TForm1.EnLettres(N:Integer):String; > > > > Const > > Unite: Array[1..16] of String=('un','deux','trois','quatre','cinq','six', > > 'sept','huit','neuf','dix','onze','douze', > > 'treize','quatorze','quinze','seize'); > > Dizaine: Array[2..8] of String=('vingt','trente','quarante','cinquante', > > 'soixante','','quatre-vingt'); > > Coefs:Array[0..3] of String=('cent','mille','million','milliard'); > > Var > > Temp: String; > > C,D,U: Byte; > > Coef: Byte; > > I: Word; > > Neg: Boolean; > > begin > > If N = 0 then > > begin > > Result := ' Zéro'; > > Exit; > > end; > > Result := ''; > > Neg := N <0; > > If Neg then N := -N; > > Coef := 0; > > Repeat > > U := N mod 10; N := N div 10; {Récupère unité et dizaine} > > D := N mod 10; N := N div 10; {Récupère dizaine} > > If D in [1,7,9] then > > begin > > Dec(D); > > Inc(U, 10); > > end; > > Temp := ''; > > If D > 1 then > > begin > > Temp := ' ' + Dizaine[D]; > > If (D < 8) and ((U = 1) or (U = 11)) then > > Temp := Temp + ' et'; > > end; > > If U > 16 then > > begin > > Temp := Temp + ' ' + Unite[10]; > > Dec(U,10); > > end; > > If U > 0 then Temp := Temp + ' ' + Unite[U]; > > If (Result = '') and (D = 8) and (U = 0) then Result := 's'; > > Result := Temp + Result; > > C := N mod 10; N := N div 10; {Récupère centaine} > > If C > 0 then > > begin > > Temp := ''; > > If C > 1 then Temp := ' ' + Unite[C] + Temp; > > Temp := Temp + ' ' + Coefs[0]; > > If (Result = '') and (C > 1) then Result := 's'; > > Result := Temp + Result; > > end; > > If N > 0 then > > begin > > Inc(Coef); > > I := N mod 1000; > > If (I > 1) and (Coef > 1) then Result := 's' + Result; > > If I > 0 then Result := ' ' + Coefs[Coef] + Result; > > If (I= 1) and (Coef = 1) then Dec(N); > > end; > > until N = 0; > > If Neg then Result := 'Moins' + Result > > else > > Result[2] := UpCase (Result[2]); > > end; > > |
> > > > et cette source : > > > > > > > > unit NombreToLettre; > > > > interface > > > > Function SommeEnChaine(Somme : Extended) : String; > > > > const > > NomUnites : Array[0..19] Of String[10] > > = ('zéro ','un ','deux ','trois ','quatre ', > > 'cinq ','six ','sept ','huit ','neuf ', > > 'dix ','onze ','douze ','treize ','quatorze ', > > 'quinze ','seize ','dix-sept ','dix-huit ','dix-neuf ' > > ); > > NomDizaines : Array[0..9] Of String[13] > > = ('','dix ','vingt ','trente ','quarante ','cinquante ', > > 'soixante ','soixante-dix ','quatre-vingt ','quatre-vingt '); > > > > NomCentaines : String[10] = 'cent'; > > NomMilliers : String[10] = 'mille'; > > NomMillions : String[10] = 'million'; > > > > LiaisonsDizainesUnites = 'et'; {trente ET un} > > LiaisonUnitesCentiemmes = 'et'; {neuf francs ET quarante centimes} > > > > NomMonaie : String = 'franc'; > > NomCentiemme : String[10] = 'centime'; > > > > {Si vous voulez juste convertir un nombre (et pas de l'argent) il suffit de > > mettre > > LiaisonUnitesCentiemmes = 'virgule'; > > > > NomMonaie : String = ''; > > NomCentiemme : String[10] = '';} > > > > implementation > > > > Function SommeEnChaine(Somme : Extended) : String; > > Var > > Millions, > > Milliers, > > Cents : Word; > > Fract : Word; > > So : Extended; > > Chn : String; > > > > Function RecuperePortion(Diviseur : Integer) : Word; > > Var > > R : Extended; > > DV : Extended; > > i : Integer; > > > > Begin > > DV := 1; > > For i := 1 To Diviseur Do > > DV := DV*10; > > R := Trunc(So / Int(DV)); > > So := So - (R*Int(DV)); > > RecuperePortion := Trunc(R); > > End; > > > > Function CentsEnChaine(C : Word;ZeroAussi : Boolean) : String; > > Var > > S : String; > > Ce,Di,Un : Byte; > > Begin > > CentsEnChaine := ''; > > S := ''; > > Ce := (C Div 100) Mod 10; > > Di := (C Div 10) Mod 10; > > Un := (C Mod 10); > > If C = 0 Then > > If ZeroAussi Then S := NomUnites[0] > > Else S := '' > > Else > > Begin > > If Ce > 0 Then > > Begin > > If ce > 1 Then > > Begin > > S := S + NomUnites[ce]+NomCentaines; > > If (Di > 0) Or (Un > 0) Then S := S + ' ' > > Else S := S + 's '; > > End > > Else > > If ce = 1 Then S := NomCentaines+' '; > > End; > > If Di > 0 Then > > Begin > > Case Di Of > > 1 : S := S + NomUnites[C Mod 100]; > > 2,3,4,5,6 > > : Begin > > S := S + NomDizaines[Di]; > > If Un = 1 Then S := S + LiaisonsDizainesUnites+ ' '; > > If Un > 0 Then S := S + NomUnites[Un]; > > End; > > 8 : Begin > > S := S + NomDizaines[DI]; > > If Un = 0 Then Insert('s',S,Length(S)) > > Else S := S + NomUnites[Un]; > > End; > > 7,9 > > : Begin > > S := S + NomDizaines[Di]; > > If Un = 1 Then > > S := S + LiaisonsDizainesUnites+ ' '; > > S := S + NomUnites[Un+10]; > > End; > > End; > > End > > Else {DI = 0 -> Pas de dizaines} > > Begin > > If Un > 0 Then > > S := S + NomUnites[Un]; > > End; > > End; > > CentsEnChaine := S; > > End; > > function SupprEspace(Str : string) : String; > > begin > > Result :=Str; > > while Pos(' ', result) > 0 do > > result := copy(result, 1, Pos(' ', result))+ > > copy(result, Pos(' ', result)+2, > > length(result)-Pos(' ', result)+2); > > end; > > > > Begin > > SommeEnChaine := ''; > > Chn := ''; > > Somme := Abs(Somme); > > Fract := Round(Frac(Somme) * 100); > > If Fract > 99 Then > > Begin > > Fract := 0; > > Somme := Somme+1; > > End; > > So := Somme; > > Millions := RecuperePortion(6); > > Milliers := RecuperePortion(3); > > Cents := Trunc(So); > > If Millions > 0 Then > > Begin > > Chn := CentsEnChaine(Millions,False) + NomMillions; > > If Millions > 1 Then Chn := Chn + 's'; > > Chn := Chn + ' '; > > End; > > If Milliers > 1 Then > > Chn := Chn + CentsEnChaine(Milliers,False) + NomMilliers+' ' > > Else > > If Milliers = 1 Then > > Chn := Chn + NomMilliers+' '; > > Chn := Chn + CentsEnChaine(Cents,(Millions=0) And (Milliers=0)) > > + NomMonaie; > > If ((Cents > 1) or (Milliers > 1) or (Millions > 1)) and (NomMonaie <>'') > > and (NomMonaie[length(NomMonaie)] <>'s') Then > > Chn := Chn + 's'; > > If Fract > 0 Then > > Begin > > Chn := Chn + ' '+LiaisonUnitesCentiemmes+' ' + CentsEnChaine(Fract,False) + NomCentiemme; > > If (Fract > 1) and (NomCentiemme<>'') and (NomCentiemme[length(NomCentiemme)] <>'s') Then Chn := Chn + 's'; > > End; > > SommeEnChaine := SupprEspace(Chn); > > End; > > > > end. > > > > |
> > > > > > VALENTIN Xavier > > www.darkskull.net > > xavier.valentin@freesbee.fr > > > > > > > > ------------------------------- > > Réponse au message : > > ------------------------------- > > > > > Bonjour, > > > > > > J'ai un p'tit pb. En effet, je voudrais "transformer", dans un string, les chiffres en lettres, mais ceci dans un string qui contient en plus des chiffres des mots voir des phrases. > > > > > > Pour être plus explicite voici un exemple : > > > > > > "monsieur xxx à 3 enfants et 2 filles qui ont chacunes 10 et 14 ans" > > > > > > et le programme doit transformer ça en : > > > > > > "monsieur xxx à trois enfants et deux filles qui ont chacunes dix et quatorze ans" > > > > > > Bien sûr il doit faire ça quelque soit le texte, et quelque soit les nombres( et le nombre qu'il y en est...) > > > > > > Si quelqu'un pourrait m'aider.... > > > > > > Merci d'avance.... > > > > > > > > > > > > VALENTIN Xavier > > > www.darkskull.net > > > xavier.valentin@freesbee.fr > > > > > >
|
|
mardi 13 mai 2003 à 17:05:15 |
Re : SVP : J'ai besoin d'aide ! ! !

Brain
|
Utilise pour ca les expressions régulières qui te retrouverons toutes les séries de chiffres http://anso.virtualave.net ------------------------------- Réponse au message : ------------------------------- > Ce qui te pose le plus de problème c'est de récupérer les chiffres dans ton string ('monsieur XXX à 3 enfants ...) > Il faudrais que du parcours ton string caractére par carctére (boucle FOR) est que tu regarde s'il s'agit d'un numérique (if s[i] in ['0'..'9'] then) dés que tu trouve un numérique il faut que tu lise les caractères suivants pour voir s'il ne s'agit pas d'un numérique sur plusieus caractères (Ex: 23), puis tu utilise EnLettre et tu fait un stringReplace de la chaine extraite par le résultat de EnLettre. Puis tu parcours le restant de ton string pour voir s'il n'y a pas d'autres chiffres. > > Je ne sais pas si j'ai été clair. > > > ------------------------------- > Réponse au message : > ------------------------------- > > > Pour la convertion des chiffres en lettres j'ai ces deux sources que j'ai trouvé, mais je n'arrive tjrs pas à faire mon truc..... > > > > Aidez-moi.... > > > > > > Voici les sources : > > > > > > Function TForm1.EnLettres(N:Integer):String; > > > > Const > > Unite: Array[1..16] of String=('un','deux','trois','quatre','cinq','six', > > 'sept','huit','neuf','dix','onze','douze', > > 'treize','quatorze','quinze','seize'); > > Dizaine: Array[2..8] of String=('vingt','trente','quarante','cinquante', > > 'soixante','','quatre-vingt'); > > Coefs:Array[0..3] of String=('cent','mille','million','milliard'); > > Var > > Temp: String; > > C,D,U: Byte; > > Coef: Byte; > > I: Word; > > Neg: Boolean; > > begin > > If N = 0 then > > begin > > Result := ' Zéro'; > > Exit; > > end; > > Result := ''; > > Neg := N <0; > > If Neg then N := -N; > > Coef := 0; > > Repeat > > U := N mod 10; N := N div 10; {Récupère unité et dizaine} > > D := N mod 10; N := N div 10; {Récupère dizaine} > > If D in [1,7,9] then > > begin > > Dec(D); > > Inc(U, 10); > > end; > > Temp := ''; > > If D > 1 then > > begin > > Temp := ' ' + Dizaine[D]; > > If (D < 8) and ((U = 1) or (U = 11)) then > > Temp := Temp + ' et'; > > end; > > If U > 16 then > > begin > > Temp := Temp + ' ' + Unite[10]; > > Dec(U,10); > > end; > > If U > 0 then Temp := Temp + ' ' + Unite[U]; > > If (Result = '') and (D = 8) and (U = 0) then Result := 's'; > > Result := Temp + Result; > > C := N mod 10; N := N div 10; {Récupère centaine} > > If C > 0 then > > begin > > Temp := ''; > > If C > 1 then Temp := ' ' + Unite[C] + Temp; > > Temp := Temp + ' ' + Coefs[0]; > > If (Result = '') and (C > 1) then Result := 's'; > > Result := Temp + Result; > > end; > > If N > 0 then > > begin > > Inc(Coef); > > I := N mod 1000; > > If (I > 1) and (Coef > 1) then Result := 's' + Result; > > If I > 0 then Result := ' ' + Coefs[Coef] + Result; > > If (I= 1) and (Coef = 1) then Dec(N); > > end; > > until N = 0; > > If Neg then Result := 'Moins' + Result > > else > > Result[2] := UpCase (Result[2]); > > end; > > |
> > > > et cette source : > > > > > > > > unit NombreToLettre; > > > > interface > > > > Function SommeEnChaine(Somme : Extended) : String; > > > > const > > NomUnites : Array[0..19] Of String[10] > > = ('zéro ','un ','deux ','trois ','quatre ', > > 'cinq ','six ','sept ','huit ','neuf ', > > 'dix ','onze ','douze ','treize ','quatorze ', > > 'quinze ','seize ','dix-sept ','dix-huit ','dix-neuf ' > > ); > > NomDizaines : Array[0..9] Of String[13] > > = ('','dix ','vingt ','trente ','quarante ','cinquante ', > > 'soixante ','soixante-dix ','quatre-vingt ','quatre-vingt '); > > > > NomCentaines : String[10] = 'cent'; > > NomMilliers : String[10] = 'mille'; > > NomMillions : String[10] = 'million'; > > > > LiaisonsDizainesUnites = 'et'; {trente ET un} > > LiaisonUnitesCentiemmes = 'et'; {neuf francs ET quarante centimes} > > > > NomMonaie : String = 'franc'; > > NomCentiemme : String[10] = 'centime'; > > > > {Si vous voulez juste convertir un nombre (et pas de l'argent) il suffit de > > mettre > > LiaisonUnitesCentiemmes = 'virgule'; > > > > NomMonaie : String = ''; > > NomCentiemme : String[10] = '';} > > > > implementation > > > > Function SommeEnChaine(Somme : Extended) : String; > > Var > > Millions, > > Milliers, > > Cents : Word; > > Fract : Word; > > So : Extended; > > Chn : String; > > > > Function RecuperePortion(Diviseur : Integer) : Word; > > Var > > R : Extended; > > DV : Extended; > > i : Integer; > > > > Begin > > DV := 1; > > For i := 1 To Diviseur Do > > DV := DV*10; > > R := Trunc(So / Int(DV)); > > So := So - (R*Int(DV)); > > RecuperePortion := Trunc(R); > > End; > > > > Function CentsEnChaine(C : Word;ZeroAussi : Boolean) : String; > > Var > > S : String; > > Ce,Di,Un : Byte; > > Begin > > CentsEnChaine := ''; > > S := ''; > > Ce := (C Div 100) Mod 10; > > Di := (C Div 10) Mod 10; > > Un := (C Mod 10); > > If C = 0 Then > > If ZeroAussi Then S := NomUnites[0] > > Else S := '' > > Else > > Begin > > If Ce > 0 Then > > Begin > > If ce > 1 Then > > Begin > > S := S + NomUnites[ce]+NomCentaines; > > If (Di > 0) Or (Un > 0) Then S := S + ' ' > > Else S := S + 's '; > > End > > Else > > If ce = 1 Then S := NomCentaines+' '; > > End; > > If Di > 0 Then > > Begin > > Case Di Of > > 1 : S := S + NomUnites[C Mod 100]; > > 2,3,4,5,6 > > : Begin > > S := S + NomDizaines[Di]; > > If Un = 1 Then S := S + LiaisonsDizainesUnites+ ' '; > > If Un > 0 Then S := S + NomUnites[Un]; > > End; > > 8 : Begin > > S := S + NomDizaines[DI]; > > If Un = 0 Then Insert('s',S,Length(S)) > > Else S := S + NomUnites[Un]; > > End; > > 7,9 > > : Begin > > S := S + NomDizaines[Di]; > > If Un = 1 Then > > S := S + LiaisonsDizainesUnites+ ' '; > > S := S + NomUnites[Un+10]; > > End; > > End; > > End > > Else {DI = 0 -> Pas de dizaines} > > Begin > > If Un > 0 Then > > S := S + NomUnites[Un]; > > End; > > End; > > CentsEnChaine := S; > > End; > > function SupprEspace(Str : string) : String; > > begin > > Result :=Str; > > while Pos(' ', result) > 0 do > > result := copy(result, 1, Pos(' ', result))+ > > copy(result, Pos(' ', result)+2, > > length(result)-Pos(' ', result)+2); > > end; > > > > Begin > > SommeEnChaine := ''; > > Chn := ''; > > Somme := Abs(Somme); > > Fract := Round(Frac(Somme) * 100); > > If Fract > 99 Then > > Begin > > Fract := 0; > > Somme := Somme+1; > > End; > > So := Somme; > > Millions := RecuperePortion(6); > > Milliers := RecuperePortion(3); > > Cents := Trunc(So); > > If Millions > 0 Then > > Begin > > Chn := CentsEnChaine(Millions,False) + NomMillions; > > If Millions > 1 Then Chn := Chn + 's'; > > Chn := Chn + ' '; > > End; > > If Milliers > 1 Then > > Chn := Chn + CentsEnChaine(Milliers,False) + NomMilliers+' ' > > Else > > If Milliers = 1 Then > > Chn := Chn + NomMilliers+' '; > > Chn := Chn + CentsEnChaine(Cents,(Millions=0) And (Milliers=0)) > > + NomMonaie; > > If ((Cents > 1) or (Milliers > 1) or (Millions > 1)) and (NomMonaie <>'') > > and (NomMonaie[length(NomMonaie)] <>'s') Then > > Chn := Chn + 's'; > > If Fract > 0 Then > > Begin > > Chn := Chn + ' '+LiaisonUnitesCentiemmes+' ' + CentsEnChaine(Fract,False) + NomCentiemme; > > If (Fract > 1) and (NomCentiemme<>'') and (NomCentiemme[length(NomCentiemme)] <>'s') Then Chn := Chn + 's'; > > End; > > SommeEnChaine := SupprEspace(Chn); > > End; > > > > end. > > > > |
> > > > > > VALENTIN Xavier > > www.darkskull.net > > xavier.valentin@freesbee.fr > > > > > > > > ------------------------------- > > Réponse au message : > > ------------------------------- > > > > > Bonjour, > > > > > > J'ai un p'tit pb. En effet, je voudrais "transformer", dans un string, les chiffres en lettres, mais ceci dans un string qui contient en plus des chiffres des mots voir des phrases. > > > > > > Pour être plus explicite voici un exemple : > > > > > > "monsieur xxx à 3 enfants et 2 filles qui ont chacunes 10 et 14 ans" > > > > > > et le programme doit transformer ça en : > > > > > > "monsieur xxx à trois enfants et deux filles qui ont chacunes dix et quatorze ans" > > > > > > Bien sûr il doit faire ça quelque soit le texte, et quelque soit les nombres( et le nombre qu'il y en est...) > > > > > > Si quelqu'un pourrait m'aider.... > > > > > > Merci d'avance.... > > > > > > > > > > > > VALENTIN Xavier > > > www.darkskull.net > > > xavier.valentin@freesbee.fr > > > > > >
|
|
Cette discussion est classée dans : aide, string, chiffres, transformer, monsieur
Répondre à ce message
Sujets en rapport avec ce message
Comment transformer un buffer non typé en string [ par bjl ]
Bonjour, je vourais transformer un buffer non typé en string.Je sais le faire avec un stream mais je pense qu'il dois y avoir plus simple et rapide.Av
Comment transformer un tableau de caractères en string (le tableau peut contenir des caractères nuls au début...) ? [ par warezpsx ]
J'ai besoin d'aide (pour améliorer la performance de mon brute force) : Savez-vous comment faire pour convertir un tableau de caractères en string (le
transformer un OleVariant en String [ par kalif ]
bonjour je suis un peu débutant dans delphi et je voudrai savoir comment faire lorsqu'on a Winsock.getdata MAVARIABLEle résultat est en OleVariantcomm
Diiférencier les chiffres des lettres dans une string? [ par kwentinn ]
Salut tt le monde!J'aimerais savoir s'il est possible de différencier les chiffres des lettres dans une string. Si oui, comment faire? Y'a-t-il une fo
Transformer un string en Tframe et inversement [ par develomagaly ]
Bonjour,Je vous explique en deux mots mon problème :Voila, je recupere à partir d'une base de données le nom d'une fenêtre à afficher ( donc il s'agit
Utlisation des attributs de la classe 1 de unit1 dans unit2 [ par emidelphi ]
le thread repond a ma question mais j'ai essayer ce que vous avez decris mais ca marche pas . j'ai le classe suivante dans unit1 : Classe1 = class(TOb
pointeurs [ par plusweb ]
Bonjour,j'aurai besoin d'aide concernant les pointeurs...C'est ma deuxieme année de pratique de delphi et j'attaque les pointeurs... J'ai trois exos a
L'appel de l'aide depuis une application recompilée en Delphi 2005 donne une erreur [ par JustForNous ]
En Delphi2005, en renseignant juste Application.HelpFile et en appelant Application.HelpContext(x); j'ai toujours le message d’erreur : "Aucune aide
Tfilestream : problème de lecture du fichier [ par bv94 ]
Bonsoir,mon problème est le suivant : je créé un type Toperation qui hérite de Tfilestream. Mais les fonctions de tfilestream que j'utilise (read, see
Identifiant refuser dans un shellexecute [ par Francky23012301 ]
Salut,Dans la procédure ci-dessous, il y a un erreur de compilation : le second nil semble posser problème. Je pense que le probleme vient de la vari
Livres en rapport
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|