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 14-03-2009 11:45:15

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

[SOURCE] Écrire un nombre en toutes lettres

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.

Code: pb

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

Code: pb

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

Code: pb

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


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

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22