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

 Oracle Discussion :

SQL Conversion chiffre en lettre


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut SQL Conversion chiffre en lettre
    Bonjour,

    Existe t il une fonction dans sql permettant de convertir un nombre en lettres?
    Exemple: "1200" devient "mille deux cent"
    Merci d'avance

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    il n'y a pas ce genre de fonction en français, seulement en anglais avec quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select to_char(to_timestamp('000001200','FF'),'ffsp') from dual
     
    TO_CHAR(TO_TIMESTAMP('000001200','FF'),'FFSP')                                
    -------------------------------------------------
    one thousand two hundred
    dans le tutorial Oracle tu trouveras une fonction qui devrait bien te servir...

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    par contre, va falloir que je m'occupe du bug de la virgule et des problèmes d'orthographe

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    j'ai corrigé le bug des zeros, la page source sera mise à jour très vite :
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    CREATE OR REPLACE FUNCTION to_word_en(pn$nombre IN NUMBER) 
       RETURN VARCHAR2 
    AS 
       -- 
       TYPE table_varchar IS TABLE OF VARCHAR2 (255); 
     
       -- 
       lv$multiples table_varchar  := table_varchar ('', 
                                      ' thousand ', 
                                      ' million ', 
                                      ' billion ', 
                                      ' trillion ', 
                                      ' quadrillion ', 
                                      ' quintillion ', 
                                      ' sextillion ', 
                                      ' septillion ', 
                                      ' octillion ', 
                                      ' nonillion ', 
                                      ' decillion ', 
                                      ' undecillion ', 
                                      ' duodecillion ', 
                                      ' tridecillion ', 
                                      ' quaddecillion ', 
                                      ' quindecillion ', 
                                      ' sexdecillion ', 
                                      ' septdecillion ', 
                                      ' octdecillion ', 
                                      ' nondecillion ', 
                                      ' dedecillion ' 
                                      ); 
     
       lv$entier           VARCHAR2 (255) := TRUNC (TO_NUMBER (REPLACE (pn$nombre, ' ', ''))); 
       lv$decimales        VARCHAR2 (255) := SUBSTR (pn$nombre - lv$entier, 2); 
       lv$mots_complets    VARCHAR2 (4000); 
       lv$entier_lettres   VARCHAR2 (4000); 
       lv$nb_zero		   INTEGER;
    BEGIN 
     
       -- 
       -- Traitement de la partie décimale 
       -- 
       IF NVL (lv$decimales, 0) != 0 
       THEN 
         FOR i IN 1 .. lv$multiples.COUNT 
         LOOP 
           EXIT WHEN lv$decimales IS NULL; 
     
           -- 
          IF (SUBSTR (lv$decimales, LENGTH (lv$decimales) - 2, 3) <> 0) 
            THEN 
             lv$mots_complets := 
                    TO_CHAR (TO_DATE (SUBSTR (lv$decimales, 
                                                LENGTH (lv$decimales) - 2, 
                                                3 
                                               ), 
                                        'j' 
                                       ), 
                               'jsp' 
                              ) 
                   || lv$multiples (i) 
                   || lv$mots_complets; 
            END IF; 
     
            lv$decimales := SUBSTR (lv$decimales, 1, LENGTH (lv$decimales) - 3); 
         END LOOP; 
     
         lv$nb_zero := instr(translate(SUBSTR (pn$nombre - lv$entier, 2),'123456789','x'),'x')-1;
    	 dbms_output.put_line(lv$decimales);
    	 IF lv$nb_zero > 0 THEN
    	   FOR i IN 1..lv$nb_zero LOOP
    	     lv$mots_complets := 'zero ' || lv$mots_complets;
           END LOOP;
         END IF;
    	 -- Annonce la décimale (remplacer par Euro pour les montants en euros par exemple) 
          lv$mots_complets := ' point ' || lv$mots_complets; 
     
       END IF; 
     
       -- 
       -- Traitement de la partie entière 
       -- 
       IF NVL (lv$entier, 0) = 0 
       THEN 
          lv$mots_complets := 'zero' || lv$mots_complets; 
       ELSE 
          FOR i IN 1 .. lv$multiples.COUNT 
          LOOP 
             EXIT WHEN lv$entier IS NULL; 
     
             -- 
             IF (SUBSTR (lv$entier, LENGTH (lv$entier) - 2, 3) <> 0) 
             THEN 
                lv$mots_complets := 
                      TO_CHAR (TO_DATE (SUBSTR (lv$entier, LENGTH (lv$entier) - 2, 
                                                3), 
                                        'j' 
                                       ), 
                               'jsp' 
                              ) 
                   || lv$multiples (i) 
                   || lv$mots_complets; 
             END IF; 
     
             lv$entier := SUBSTR (lv$entier, 1, LENGTH (lv$entier) - 3); 
          END LOOP; 
       END IF; 
     
       RETURN lv$mots_complets; 
    END to_word_en; 
    /
    Edit : la page source est à jour et le pluriel était déjà OK

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    moi je dirais quatre-vingt mille sans s à vingt

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ha oui... mais quatre-vingts-millions

    d'ailleurs, le trait d'union est aussi manquant

  9. #9
    Candidat au Club
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je travaille sous SQL server.
    Avez vous cette fonction déjà codée en Transact-SQL? Je ne connais pas les équivalences des fonctions en Oracle

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    tu as vu que tu étais dans le forum Oracle ?

    Eventuellement tu peut solliciter un membre du forum SQL Server pour qu'il fasse une "traduction" T-SQL

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    bonjour
    d’abord merci pour ces efforts
    juste une petite contribution
    1)
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF SUBSTR(lv$nombre_fr,1,8)='un mille' THEN
            lv$nombre_fr := SUBSTR(lv$nombre_fr,4);
        END IF;
    Moi j’ai juste ajouté un REPLACE

    ………….
    , 'cent un mille' , 'cent un mille' ) 
    , ’un cent’ , ‘cent’ )
    , ‘un mille’ , ‘mille’ )
    ……..
    A première vue on dira que ca marche pas parce qu’un autre replace changera le ‘un mille’ en ‘mille’ et le problème reste le même,
    mais si on regarde bien il ya deux espace entre ‘un ‘ et ‘mille’ 'cent un mille'


    2)
    pour les zéros ca dépendra de l’utilisation de cette fonction
    si c’est pour les monnaies c’est inutile
    car 1,03 => un euro et trois centimes on dis pas un euro et zéro trois centimes
    une mise en garde pour l’utilisation de la fonction to_word_en pour la conversion des monnaies
    le 2eme paramètre devra être fixé a 2.
    Pour cela j’ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lv$decimales        VARCHAR2(255) := SUBSTR (pn$nombre - lv$entier, 2);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lv$decimales        VARCHAR2 (255) := SUBSTR (to_char(pn$nombre - lv$entier,'9D00'), -pn$precision);
    je sais que vous avez déjà compris l’intérêt.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Cela fonctionne bien mais j'ai un petit soucis avec des nombres comme 100.20
    ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > select to_word_en(1000.20) from dual
    one thousand point two
    alors que je m'attends à one thousand point twenty car avec des montants, c'est vingt centimes et pas deux centimes

    le soucis semble venir du TO_NUMBER qui tronque la partie après la virgule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > select TO_NUMBER(1000.20) from dual;
    1000,2
    Si quelqu'un a des idées, je suis preneur
    merci,

Discussions similaires

  1. Conversion chiffre en lettre
    Par agencep dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 10/04/2008, 16h38
  2. conversion chiffres en lettres
    Par djazair dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 03/07/2007, 18h24
  3. Réponses: 1
    Dernier message: 30/05/2007, 18h19
  4. conversion chiffre en lettre
    Par dejiein dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/06/2006, 09h50
  5. conversion chiffre en lettre
    Par arezki76 dans le forum Oracle
    Réponses: 3
    Dernier message: 17/12/2005, 12h31

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