Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Invité de passage
    Inscrit en
    février 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 4
    Points : 0
    Points
    0

    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
    Expert Confirmé Avatar de LeoAnderson
    Inscrit en
    septembre 2004
    Messages
    2 940
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 2 940
    Points : 3 030
    Points
    3 030

  3. #3
    Rédacteur
    Avatar de orafrance
    Inscrit en
    janvier 2004
    Messages
    15 966
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 966
    Points : 16 759
    Points
    16 759

  4. #4
    Expert Confirmé Sénior

    Avatar de laurentschneider
    Homme Profil pro Laurent Schneider
    Administrateur de base de données
    Inscrit en
    décembre 2005
    Messages
    2 942
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent Schneider
    Localisation : Suisse

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 2 942
    Points : 4 536
    Points
    4 536

    Par défaut

    il n'y a pas ce genre de fonction en français, seulement en anglais avec quelque chose du style
    Code :
    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
    Rédacteur
    Avatar de orafrance
    Inscrit en
    janvier 2004
    Messages
    15 966
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 966
    Points : 16 759
    Points
    16 759

    Par défaut

    par contre, va falloir que je m'occupe du bug de la virgule et des problèmes d'orthographe

  6. #6
    Rédacteur
    Avatar de orafrance
    Inscrit en
    janvier 2004
    Messages
    15 966
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 966
    Points : 16 759
    Points
    16 759

    Par défaut

    j'ai corrigé le bug des zeros, la page source sera mise à jour très vite :
    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
    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é Sénior

    Avatar de laurentschneider
    Homme Profil pro Laurent Schneider
    Administrateur de base de données
    Inscrit en
    décembre 2005
    Messages
    2 942
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent Schneider
    Localisation : Suisse

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 2 942
    Points : 4 536
    Points
    4 536

    Par défaut

    moi je dirais quatre-vingt mille sans s à vingt

  8. #8
    Rédacteur
    Avatar de orafrance
    Inscrit en
    janvier 2004
    Messages
    15 966
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 966
    Points : 16 759
    Points
    16 759

    Par défaut

    ha oui... mais quatre-vingts-millions

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

  9. #9
    Invité de passage
    Inscrit en
    février 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 4
    Points : 0
    Points
    0

    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
    Rédacteur
    Avatar de orafrance
    Inscrit en
    janvier 2004
    Messages
    15 966
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 966
    Points : 16 759
    Points
    16 759

    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
    Invité régulier
    Inscrit en
    juillet 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 10
    Points : 5
    Points
    5

    Par défaut

    bonjour
    d’abord merci pour ces efforts
    juste une petite contribution
    1)
    à la place de
    Code :
    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 :
    lv$decimales        VARCHAR2(255) := SUBSTR (pn$nombre - lv$entier, 2);
    par
    Code :
    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
    Invité régulier
    Inscrit en
    novembre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 29
    Points : 8
    Points
    8

    Par défaut

    Cela fonctionne bien mais j'ai un petit soucis avec des nombres comme 100.20
    ainsi:
    Code :
    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 :
    1
    2
    > SELECT TO_NUMBER(1000.20) FROM dual;
    1000,2
    Si quelqu'un a des idées, je suis preneur
    merci,

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •