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