Répétez apres moi :J'aime PBAdonf. J'aime PBAdonf. J'aime PBAdonf.

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

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 13-03-2009 15:27:49

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

[RESOLU] Transformation chiffre en lettre

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

 

#2 13-03-2009 15:36:07

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,775,808
Site web

Re: [RESOLU] Transformation chiffre en lettre

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...


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#3 13-03-2009 15:39:28

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

Re: [RESOLU] Transformation chiffre en lettre

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

 

#4 13-03-2009 18:40:13

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5122
Pépites: 97,200
Banque: 2,147,483,647

Re: [RESOLU] Transformation chiffre en lettre

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


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#5 22-04-2009 09:46:06

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

Re: [RESOLU] Transformation chiffre en lettre

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

 

#6 22-04-2009 09:52:44

wazou1812  
Modératrice
Award: bf
Date d'inscription: 24-05-2006
Messages: 610
Pépites: 2,097
Banque: 3,536,631,712,504

Re: [RESOLU] Transformation chiffre en lettre

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

 

#7 22-04-2009 10:12:03

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

Re: [RESOLU] Transformation chiffre en lettre

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

Code: pb

//***********
// 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

Code: pb

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

Code: pb

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

Code: pb

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

Code: pb

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

 

#8 22-04-2009 16:29:04

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,775,808

Re: [RESOLU] Transformation chiffre en lettre

0 000 pepites pour toi


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22