Powerbuilder pour les completement Geeks !

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