IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

Une lib qui écrit les chiffres en toutes lettres ?


Sujet :

Ruby

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    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

  2. #2
    Membre expérimenté Avatar de rivsc
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 213
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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(" ")

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    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

  4. #4
    Membre expérimenté Avatar de rivsc
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 213
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)));
     
    }

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    @Rivsc : Ouais c'est ce que j'ai fait !
    Et voilà \o/
    Merci au gars qui a fait le TP
    OPEN SOURCE POWAAAA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/05/2007, 22h49
  2. besoin d'une API qui exploite les fichier Word
    Par fafa624 dans le forum Documents
    Réponses: 1
    Dernier message: 16/12/2006, 17h01
  3. [VBA-PP]fonction qui écrit un chiffre dans une cellule excel
    Par alpking dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/04/2006, 19h34
  4. une méthode qui écrit dans la sortie html ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/12/2003, 15h34
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 03h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo