Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
J'avais fait ça il y a longtemps... (peut-être que Sweey a ça dans ses archives aussi )
Voici 3 fonctions d'un NVO, il faut appeler la fonction of_touteslettres( le nombre, le séparateur de mots )
Le cas de figure des nombres négatifs et des décimales n'est pas couvert, mais il y a peu de choses à ajouter pour le faire.
public function string of_touteslettres (longlong al_nombre, string as_separateur); // But: Convertit un nombre entier positif en toutes lettres // Entrees: longlong : le nombre a convertir // chaine : séparateur (p.ex : ' ' ou '-' ) // Sortie: chaine : le nombre en toutes lettres // Hyp.: nombre inférieur à 10 milliards // Appels: of_touteslettres999 // of_touteslettres19 LongLong ll_milliard, ll_million, ll_mille LongLong ll_unite LongLong ll_reste, ll_inter String ls_resultat ='' // 1. zéro If al_nombre = 0 Then Return 'zéro' // 2. décomposition ll_reste = LongLong( Mod( al_nombre, 1E9 ) ) ll_milliard= LongLong( ( al_nombre - ll_reste ) / 1E9 ) ll_inter = ll_reste ll_reste = Mod( ll_inter,1000000 ) ll_million = ( ll_inter - ll_reste ) /1000000 ll_inter = ll_reste ll_reste = Mod( ll_inter,1000 ) ll_mille = ( ll_inter - ll_reste ) /1000 ll_unite = ll_reste // 3. milliards If ll_milliard > 0 Then ls_resultat += This.of_touteslettres999( ll_milliard, as_separateur, False ) ls_resultat += as_separateur + 'milliard' If ll_milliard > 1 Then ls_resultat += 's' If ll_million + ll_mille + ll_unite > 0 Then ls_resultat += as_separateur End If // 4. millions If ll_million > 0 Then ls_resultat += This.of_touteslettres999( ll_million, as_separateur, False ) ls_resultat += as_separateur + 'million' If ll_million > 1 Then ls_resultat += 's' If ll_mille + ll_unite > 0 Then ls_resultat += as_separateur End If // 5. milliers If ll_mille > 0 Then If ll_mille = 1 Then ls_resultat += 'mille' Else ls_resultat += This.of_touteslettres999( ll_mille, as_separateur, False ) ls_resultat += as_separateur + 'mille' If ll_unite = 0 Then ls_resultat += 's' Else ls_resultat += as_separateur End If End If End If // 6. unités If ll_unite > 0 Then ls_resultat += This.of_touteslettres999( ll_unite, as_separateur, True ) End If Return ls_resultat end function
public function string of_touteslettres999 (long al_nombre, string as_separateur, boolean ab_fin); // But: Convertit un nombre entier compris entre 0 et 999 en toutes lettres // Entrees: long : le nombre a convertir // chaine : séparateur (p.ex :' ' ou '-' ) // boolean : si groupement de fin (unités) ? // Sortie: chaine : le nombre en toutes lettres // Hyp.: nombre compris entre 0 et 999 // Appels: of_touteslettres19 Long ll_centaine, ll_99, ll_dizaine, ll_19 Long ll_unite, ll_reste String ls_resultat = '' // 1. décomposition ll_reste = Mod( al_nombre, 100 ) ll_centaine = ( al_nombre - ll_reste ) / 100 ll_99 = ll_reste ll_reste = Mod( ll_99, 10 ) ll_dizaine = ( ll_99 - ll_reste ) / 10 ll_unite = ll_reste // 2. centaines If ll_centaine > 1 Then ls_resultat += This.of_touteslettres19( ll_centaine, as_separateur ) ls_resultat += as_separateur + 'cent' If ll_99 = 0 and ll_centaine > 1 and ab_fin Then ls_resultat += 's' ElseIf ll_centaine = 1 Then ls_resultat += 'cent' End If // 3. séparateur (if av) If ll_99 > 0 And ll_centaine > 0 Then ls_resultat += as_separateur // 4. dizaines ll_19 = ll_unite Choose Case ll_dizaine Case 0 // rien Case 1 ; ll_19 += 10 Case 2 ; ls_resultat += 'vingt' Case 3 ; ls_resultat += 'trente' Case 4 ; ls_resultat += 'quarante' Case 5 ; ls_resultat += 'cinquante' Case 6 ; ls_resultat += 'soixante' Case 7 ls_resultat += 'soixante' ll_19 += 10 Case 8 ls_resultat += 'quatre' + as_separateur + 'vingt' Case 9 ls_resultat += 'quatre' + as_separateur + 'vingt' ll_19 += 10 End Choose // 5. 'et' + séparateur (if av) If ll_unite = 1 And ll_dizaine > 1 And ll_dizaine < 9 Then ls_resultat += as_separateur + 'et' + as_separateur ElseIf ll_99 = 70 Or ll_99 = 90 Or ll_99 = 91 Then ls_resultat += as_separateur ElseIf ll_unite > 1 And ll_dizaine > 1 Then ls_resultat += as_separateur End If // 6. pseudo-unités ls_resultat += This.of_touteslettres19( ll_19, as_separateur ) Return ls_resultat end function
public function string of_touteslettres19 (long al_nombre, string as_separateur); // But: Convertit un nombre entier compris entre 0 et 19 en toutes lettres // Entrees: long : le nombre a convertir // chaine : séparateur (p.ex : ' ' ou '-' ) // Sortie: chaine : le nombre en toutes lettres // Hyp.: nombre compris entre 0 et 19 String ls_resultat Choose Case al_nombre Case 0 ; ls_resultat = '' Case 1 ; ls_resultat = 'un' Case 2 ; ls_resultat = 'deux' Case 3 ; ls_resultat = 'trois' Case 4 ; ls_resultat = 'quatre' Case 5 ; ls_resultat = 'cinq' Case 6 ; ls_resultat = 'six' Case 7 ; ls_resultat = 'sept' Case 8 ; ls_resultat = 'huit' Case 9 ; ls_resultat = 'neuf' Case 10 ; ls_resultat = 'dix' Case 11 ; ls_resultat = 'onze' Case 12 ; ls_resultat = 'douze' Case 13 ; ls_resultat = 'treize' Case 14 ; ls_resultat = 'quatorze' Case 15 ; ls_resultat = 'quinze' Case 16 ; ls_resultat = 'seize' Case 17 ; ls_resultat = 'dix' + as_separateur + 'sept' Case 18 ; ls_resultat = 'dix' + as_separateur + 'huit' Case 19 ; ls_resultat = 'dix' + as_separateur + 'neuf' End Choose Return ls_resultat end function
PS : D'ailleurs en reparcourant ce code je me souviens comme j'ai pu envier nos cousins belges et suisses avec leur septante, octante, nonante... encore bien un craquage à la française ces histoires de soixante-dix, quatre-vingt et cie...
Hors ligne
Pages: 1