Le forum (ô combien francophone) des utilisateurs de Powerbuilder.




Bonjour, je voudrais savoir s'il existe une fonction permettant de transformer un nombre en lettre par exemple :
465, 84 € : quatre cent soixante cinq euros quatre vingt quatre centimes
Merci
Dernière modification par julien (22-04-2009 09:44:03)
Hors ligne
Il faut la créer, elle n'existe pas en standard dans PB.
Attention aussi à la devise et la langue, certaines devises ne s'accordent pas...
Hors ligne




Oui, je me doutais un peu qu'elle n'existait pas malheureusement.
Est ce que quelqu'un en a déjà réalisé une ? Cela me ferais gagner beaucoup de temps
Merci
Hors ligne














j'ai ressorti un script de mes archives, j'ai fait un topic ici : [SOURCE] Écrire un nombre en toutes lettres
Hors ligne




Au final, j'ai utilisé une fonction existant dans Excel que j'ai porté dans une custom class, apres un peu de bidouillage ca fonctionne super bien !
Dernière modification par julien (22-04-2009 09:46:23)
Hors ligne







julien a écrit:
Au final, j'ai utilisé une fonction existant dans Excel que j'ai porté dans une custom class, apres un peu de bidouillage ca fonctionne super bien !
bonjour,
Et tu peux peut -être nous faire profiter de ta solution ?
Hors ligne




oui, bien sur !
ma custom class se compose des 5 fonctions suivantes :
f_conv_number_letter (ld_nombre decimal, li_devise integer, li_langue integer, li_casse integer, li_zerocent integer) = string
//*********** // Devise=0 aucune // =2 Dollar $ // =1 Belgique // =2 Suisse // Casse =0 Minuscule // =2 Majuscule // =1 Mentionne toujours les cents //*********** boolean lb_negatif string ls_dev, ls_centimes, ls_resultat any a_ent integer li_bydec IF ld_nombre < 0 THEN lb_negatif = True ld_nombre = Abs(ld_nombre) END IF a_ent = longlong(ld_nombre) li_bydec = round(((ld_nombre - a_ent) * 100), 0) IF li_bydec = 0 THEN IF a_ent > 999999999999999 THEN ls_resultat = "TropGrand" RETURN ls_resultat END IF END IF CHOOSE CASE li_devise Case 0 IF li_bydec > 0 THEN ls_dev = " virgule " Case 1 ls_dev = " Euro" IF int(a_ent) >= 1000000 AND Right(string(a_ent), 6) = "000000" THEN ls_dev = " d'Euro" If li_bydec > 0 THEN ls_centimes = ls_centimes + " Centime" If li_bydec > 1 THEN ls_centimes = ls_centimes + "s" Case 2 ls_dev = " Dollar" IF li_bydec > 0 THEN ls_centimes = ls_centimes + " Cent" Case 3 ls_dev = IF a_ent >= 1000000 AND Right(a_ent, 6) = "000000" THEN ls_dev = If li_bydec > 0 THEN ls_centimes = ls_centimes + " Centime" If li_bydec > 1 THEN ls_centimes = ls_centimes + "s" END CHOOSE IF a_ent > 1 AND li_devise <> 0 THEN ls_dev = ls_dev + "s" ls_dev = ls_dev + " " IF a_ent = 0 THEN ls_resultat = + ls_dev ELSE ls_resultat = f_conv_num_ent(dec(a_ent), li_langue) + ls_dev END IF IF li_bydec = 0 THEN IF li_devise <> 0 THEN IF li_zerocent = 1 THEN ls_resultat = ls_resultat + END IF ELSE IF li_devise = 0 THEN ls_resultat = ls_resultat + f_conv_num_dizaine(li_bydec, li_langue, True) + ls_centimes ELSE ls_resultat = ls_resultat + f_conv_num_dizaine(li_bydec, li_langue, False) + ls_centimes END IF END IF // ls_resultat = Replace(ls_resultat, " ", 1, " ") ls_resultat = trim(ls_resultat) CHOOSE CASE li_casse CASE 0 ls_resultat = lower(ls_resultat) Case 1 ls_resultat = upper(Left(ls_resultat, 1)) + lower(Right(ls_resultat, Len(ls_resultat) - 1)) Case 2 ls_resultat = upper(ls_resultat) Case 3 ls_resultat = ls_resultat END CHOOSE RETURN ls_resultat
f_conv_num_cent (li_nombre integer, li_langue integer) = string
any TabUnit[] integer li_bycent, li_byreste string ls_reste, ls_resultat TabUnit[] = {"", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix"} li_bycent = Int(li_nombre / 100) li_byreste = li_nombre - (li_bycent * 100) ls_reste = f_conv_num_dizaine(li_byreste, li_langue, False) CHOOSE CASE li_bycent CASE 0 ls_resultat = ls_reste CASE 1 IF li_byreste = 0 Then ls_resultat = "cent" ELSE ls_resultat = "cent " + ls_reste END IF CASE ELSE IF li_byreste = 0 THEN ls_resultat = TabUnit[li_bycent + 1] + " cents" ELSE ls_resultat = TabUnit[li_byCent + 1] + " cent " + ls_reste END IF END CHOOSE RETURN ls_resultat
f_conv_num_dizaine (li_nombre integer, li_langue integer, lb_dec boolean) = string
any TabUnit[], TabDiz[] integer li_byunit, li_bydiz string ls_liaison, ls_resultat IF lb_dec THEN TabDiz[] = {, "", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante", "quatre-vingt", "quatre-vingt"} ELSE TabDiz[] = {"", "", "vingt", "trente", "quarante", "cinquante", "soixante", "soixante", "quatre-vingt", "quatre-vingt"} END IF IF li_nombre = 0 THEN TabUnit[] = {} ELSE TabUnit[] = {"", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf"} END IF IF li_langue = 1 THEN TabDiz[7] = "septante" TabDiz[9] = "nonante" ELSEIF li_langue = 2 THEN TabDiz[7] = "septante" TabDiz[8] = "huitante" TabDiz[9] = "nonante" END IF li_bydiz = Int(li_nombre / 10) li_byunit = li_nombre - (li_bydiz * 10) ls_liaison = "-" IF li_byunit = 1 THEN ls_liaison = " et " CHOOSE CASE li_bydiz Case 0 ls_liaison = " " Case 1 li_byunit = li_byunit + 10 ls_liaison = "" Case 7 IF li_langue = 0 THEN li_byunit = li_byunit + 10 Case 8 IF li_langue <> 2 THEN ls_liaison = "-" Case 9 IF li_langue = 0 THEN li_byunit = li_byunit + 10 ls_liaison = "-" END IF END CHOOSE ls_resultat = TabDiz[li_bydiz + 1] IF li_bydiz = 8 AND li_langue <> 2 AND li_byunit = 0 THEN ls_resultat = ls_resultat + "s" IF TabUnit[li_byunit + 1] <> "" THEN ls_resultat = ls_resultat + ls_liaison + TabUnit[li_byunit + 1] ELSE ls_resultat = ls_resultat End If RETURN ls_resultat
f_conv_num_ent (ld_nombre decimal, li_langue integer ) = string
any a_tmp decimal ld_reste string ls_tmp, ls_resultat integer li_cent, li_mille, li_million, li_milliard, li_billion a_tmp = ld_nombre - (Int(ld_nombre / 1000) * 1000) li_cent = round(a_tmp, 0) ls_resultat = f_nz(f_conv_num_cent(li_cent, li_langue)) ld_reste = Int(ld_nombre / 1000) IF a_tmp = 0 AND ld_reste = 0 THEN RETURN ls_resultat a_tmp = ld_reste - (Int(ld_reste / 1000) * 1000) IF a_tmp = 0 AND ld_reste = 0 THEN RETURN ls_resultat li_mille = round(a_tmp, 0) ls_tmp = f_conv_num_cent(li_mille, li_langue) CHOOSE CASE a_tmp CASE 0 CASE 1 ls_tmp = " mille " CASE ELSE ls_tmp = ls_tmp + " mille " END CHOOSE IF li_mille = 0 AND li_cent > 0 THEN ls_resultat = "et " + ls_resultat ls_resultat = f_nz(ls_tmp) + ls_resultat ld_reste = Int(ld_reste / 1000) a_tmp = ld_reste - (Int(ld_reste / 1000) * 1000) IF a_tmp = 0 AND ld_reste = 0 THEN RETURN ls_resultat li_million = round(a_tmp, 0) ls_tmp = f_conv_num_cent(li_million, li_langue) CHOOSE CASE a_tmp CASE 0 CASE 1 ls_tmp = ls_tmp + " million " CASE ELSE ls_tmp = ls_tmp + " millions " END CHOOSE IF li_mille = 1 THEN ls_resultat = "et " + ls_resultat ls_resultat = f_nz(ls_tmp) + ls_resultat ld_reste = Int(ld_reste / 1000) a_tmp = ld_reste - (Int(ld_reste / 1000) * 1000) IF a_tmp = 0 AND ld_reste = 0 THEN RETURN ls_resultat li_milliard = round(a_tmp, 0) ls_tmp = f_conv_num_cent(li_milliard, li_langue) CHOOSE CASE a_tmp CASE 0 CASE 1 ls_tmp = ls_tmp + " milliard " CASE ELSE ls_tmp = ls_tmp + " milliards " END CHOOSE IF li_million = 1 THEN ls_resultat = "et " + ls_resultat ls_resultat = f_nz(ls_tmp) + ls_resultat ld_reste = Int(ld_reste / 1000) a_tmp = ld_reste - (Int(ld_reste / 1000) * 1000) IF a_tmp = 0 AND ld_reste = 0 THEN RETURN ls_resultat li_billion = round(a_tmp, 0) ls_tmp = f_conv_num_cent(li_billion, li_langue) CHOOSE CASE a_tmp Case 0 Case 1 ls_tmp = ls_tmp + " billion " CASE ELSE ls_tmp = ls_tmp + " billions " END CHOOSE IF li_milliard = 1 THEN ls_resultat = "et " + ls_resultat ls_resultat = f_nz(ls_tmp) + ls_resultat ls_resultat = ls_resultat RETURN ls_resultat
f_nz (ls_nb string) = string
IF ls_nb <> THEN RETURN ls_nb ELSE RETURN ""
La fonction a appeler est f_conv_number_letter avec tous ses paramètres d'entrées, les autres fonctions sont appelés automatiquement.
Dernière modification par julien (22-04-2009 10:17:50)
Hors ligne










0 000 pepites pour toi
Hors ligne