Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Ruby
Ruby Le forum sur la programmation Ruby. Voir aussi la FAQ Ruby et les cours Ruby.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2011, 01h47   #1
Modérateur
 
Inscription : janvier 2007
Messages : 511
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 511
Points : 559
Points : 559
Par défaut Une lib qui écrit les chiffres en toutes lettres ?

Bonjour,

Dans la base de données, je récupère un prix (avec des virgules) et j'aurais besoin de l'écrire en toute lettres, et évidemment en français.
Par exemple, je récupère 1234 et il faut que j'écrive "Mille trois cent trente quatre"
Je me demandais si il existe des libs qui font ça ?
Merci d'avance pour vos suggestions
Zfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 10h05   #2
Membre actif
 
Avatar de rivsc
 
Sylvain Claudel
Inscription : décembre 2008
Messages : 195
Détails du profil
Informations personnelles :
Nom : Sylvain Claudel
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : décembre 2008
Messages : 195
Points : 199
Points : 199
Bon j'ai trouvé ça : http://api.rubyonrails.org/classes/A...umber_to_human mais malheureusement ça ne fait que s'approcher de ce que tu cherches. (l'option locale permet le français)

Code :
1
2
ActionView::Base.new.number_to_human(2235516516516, :precision => 2, :locale => :fr)
 => "2,2 billion"
En fait tu dois pouvoir le faire en pas trop de temps, un truc dans le genre (bon c'est pas fini y a encore des chiffres...) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
chiffre="2235516516516"
caption = []
i = 0
chiffre.each_char do |c|
  mavar = ActionView::Base.new.number_to_human(chiffre[i..chiffre.length].to_i,
:precision => 6,
:significant => false,
:locale => :fr)
  mavar = mavar.pluralize if c.to_i > 1
  caption << mavar.gsub(/,(\d+)/, "")
  i += mavar[/(\d+)/].length
  break if i >= chiffre.length
end
caption.join(" ")
rivsc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 18h23   #3
Modérateur
 
Inscription : janvier 2007
Messages : 511
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 511
Points : 559
Points : 559
Ah ouais merci Rivsc, c'est pas mal du tout ton idée.
Ca me semble quand même un gros boulot à faire, si on veut tenir compte de toutes les règles d'orthographe à respecter, les traits d'union, les accords etc...
Et la traduction en français, c'est pareil, il faut se cogner tous les termes, sans en oublier...
Je ne sais pas encore si je me lance là dedans, en tout cas, certains l'ont déjà fait, en php, semble t-il: http://www.leconjugueur.com/frnombre.php
Zfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 14h46   #4
Membre actif
 
Avatar de rivsc
 
Sylvain Claudel
Inscription : décembre 2008
Messages : 195
Détails du profil
Informations personnelles :
Nom : Sylvain Claudel
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : décembre 2008
Messages : 195
Points : 199
Points : 199
Tiens sinon tu prends le bout de code là tu l'écris en ruby (combiné avec le code ci-dessus) et ça devrait être bon :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
function num2Letters(number) {
 
  if (isNaN(number) || number < 0 || 999 < number) {
    return 'Veuillez entrer un nombre entier compris entre 0 et 999.';
  }
 
  var units2Letters = ['', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf'],
      tens2Letters = ['', 'dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante', 'quatre-vingt', 'quatre-vingt'];
 
  var units = number % 10,
      tens = (number % 100 - units) / 10,
      hundreds = (number % 1000 - number % 100) / 100;
 
  var unitsOut, tensOut, hundredsOut;
 
 
  if (number === 0) {
 
    return 'zéro';
 
  } else {
 
    // Traitement des unités
 
      unitsOut = (units === 1 && tens > 0 && tens !== 8 ? 'et-' : '') + units2Letters[units];
 
    // Traitement des dizaines
 
      if (tens === 1 && units > 0) {
 
        tensOut = units2Letters[10 + units];
        unitsOut = '';
 
      } else if (tens === 7 || tens === 9) {
 
        tensOut = tens2Letters[tens] +'-'+ (tens === 7 && units === 1 ? 'et-' : '') + units2Letters[10 + units];
        unitsOut = '';
 
      } else {
 
        tensOut = tens2Letters[tens];
 
      }
 
 
      tensOut += (units === 0 && tens === 8 ? 's' : '');
 
    // Traitement des centaines
 
      hundredsOut = (hundreds > 1 ? units2Letters[hundreds] + '-' : '') + (hundreds > 0 ? 'cent' : '') + (hundreds > 1 && tens == 0 && units == 0 ? 's' : '');
 
    // Retour du total
 
      return hundredsOut + (hundredsOut && tensOut ? '-': '') + tensOut + (hundredsOut && unitsOut || tensOut && unitsOut ? '-': '') + unitsOut;
  }
 
}
 
 
 
var userEntry;
 
while (userEntry = prompt('Indiquez le nombre à écrire en toutes lettres (entre 0 et 999) :')) {
 
  alert(num2Letters(parseInt(userEntry, 10)));
 
}
rivsc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2011, 00h13   #5
Modérateur
 
Inscription : janvier 2007
Messages : 511
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 511
Points : 559
Points : 559
@Rivsc : Ouais c'est ce que j'ai fait !
Et voilà \o/
Merci au gars qui a fait le TP
OPEN SOURCE POWAAAA
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
def affiche_nombre_3_chiffres_en_lettres(nombre)
    unites2letters = ['', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf']
    dizaines2letters = ['', 'dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante', 'quatre-vingt', 'quatre-vingt']
    ### TRAITEMENT DU NOMBRE
    tab_nombre = nombre.to_i.to_s.split('').reverse
    centaine = tab_nombre[2].to_i
    dizaine = tab_nombre[1].to_i
    unite = tab_nombre[0].to_i
    ### TRAITEMENT DES UNITES
    unite_out = (unite == 1 && dizaine > 0 && dizaine != 8 ? 'et-' : '') + unites2letters[unite]
    ### TRAITEMENT DES DIZAINES
    if dizaine == 1 && unite > 0 ### Nombres de 11 à 19
      dizaine_out = unites2letters[10 + unite]
      unite_out = ''
    elsif dizaine == 7 || dizaine == 9 ### Cas de 71 à 79 et 91 à 99
      dizaine_out = dizaines2letters[dizaine] + '-' + (dizaine == 7 && unite == 1 ? 'et-' : '') + unites2letters[10 + unite]
      unite_out = ''
    else
      dizaine_out = dizaines2letters[dizaine] ### Cas normal
    end
    dizaine_out += (unite == 0 && dizaine == 8 ? 's' : ''); ### 80 sans unités prend un "s" à la fin
    ### TRAITEMENT DES CENTAINES
    centaine_out = (centaine > 1 ? unites2letters[centaine] + '-' : '') + (centaine > 0 ? 'cent' : '') + (centaine > 1 && dizaine == 0 && unite == 0 ? 's' : '')
    ### TRAITEMENT DU RESULTAT
    resultat = ''
    resultat += centaine_out 
    resultat += (!centaine_out.blank? && !dizaine_out.blank? ? '-': '') 
    resultat += dizaine_out 
    resultat += (!centaine_out.blank? && !unite_out.blank? || !dizaine_out.blank? && !unite_out.blank? ? '-': '') 
    resultat += unite_out
    return resultat
  end
Zfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h04.


 
 
 
 
Partenaires

Hébergement Web