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]convertion d'un nombre en toute lettre


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 67
    Points
    67
    Par défaut [sql]convertion d'un nombre en toute lettre
    bonjours a tous
    je veux convertir un montant d'une facture en toute lettre
    merci d'avence pour votre aide

  2. #2
    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

  3. #3
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Hello,

    En quelle langue ?

    Tu peux peut etre t'inspirer de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select to_char(to_date(11221, 'J'), 'Jsp') from dual
     
    TO_CHAR(TO_DATE(11221,'J'),'JSP')     
    --------------------------------------
    Eleven Thousand Two Hundred Twenty-One
     
    1 row selected.

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  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




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL> SELECT translate_fr(to_word_en(101000)) FROM dual;                                                                                                                         
    cent mille

  5. #5
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par laurentschneider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL> SELECT translate_fr(to_word_en(101000)) FROM dual;                                                                                                                         
    cent mille
    euuuuh c'est pas pour dire... mais moi je vois cent UN mille en chiffres...

    problème de copier-coller ?
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  6. #6
    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
    c'est donc un bug dans la fonction référencée (par fred)


    PS: désolé d'être aussi avare en commentaires, je voulais juste rendre attentif au fait que la fonction de traduction en français n'était pas 100% correcte

  7. #7
    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
    Voila qui devrait régler le problème :


  8. #8
    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
    Citation Envoyé par Fred_D
    Voila qui devrait régler le problème :
    oui c'est mieux, mais je pense que ça doit encore être testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL> SELECT translate_fr(to_word_en(1001000)) FROM dual;
    un million un mille
    8)

  9. #9
    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
    l'orthographe aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 21000000                                                                                                                                                     
    TRANSLATE_FR(TO_WORD_EN(21000000))
    -------------------------------------------------
    vingt et un million
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 20000000                                                                                                                                                     
    TRANSLATE_FR(TO_WORD_EN(20000000))
    -------------------------------------------------
    vingt millions

  10. #10
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 1.5
    TRANSLATE_FR(TO_WORD_EN(1.5))
    ------------------------------------------
    un virgule cinq
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 0.5
     
    TRANSLATE_FR(TO_WORD_EN(0.5))
    ------------------------------------------
    zero

  11. #11
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
     
    Enter value for n: 1.01
    TRANSLATE_FR(TO_WORD_EN(1.01))
    -------------------------------------------
    un virgule un
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
     
    Enter value for n: 1.1
    TRANSLATE_FR(TO_WORD_EN(1.1))
    ------------------------------------------
    un virgule un

  12. #12
    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
    Cool, j'ai un bon testeur là

    Essaye ceci :

    J'espère que ce coup ci, c'est la bonne

  13. #13
    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
    pour les décimales... je verrais plus tard, je ne suis pas l'auteur de to_word_en

  14. #14
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par laurentschneider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 1.5
    TRANSLATE_FR(TO_WORD_EN(1.5))
    ------------------------------------------
    un virgule cinq
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 0.5
     
    TRANSLATE_FR(TO_WORD_EN(0.5))
    ------------------------------------------
    zero
    Salut,
    sauf erreur, le problème du "zéro virgule cinq" vient de la fonction sous-jacente de to_word_en

    en passant par un to_date en calendrier julien, on ne peut pas avoir moins que 1 en entrée...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  15. #15
    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
    et voila :

    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
    111
    112
    113
    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$partie_decimale  VARCHAR2 (255) := lv$decimales;
    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; 
     
          -- Annonce la décimale (remplacer par Euro pour les montants en euros par exemple) et les zéros avant le nombre significatif
          FOR i IN 1..LENGTH(lv$partie_decimale)
          LOOP
          	EXIT WHEN SUBSTR(lv$partie_decimale,i,1) <> 0;
     
          	lv$mots_complets := ' zero ' || lv$mots_complets; 
     
          END LOOP;
     
          lv$mots_complets := ' point ' || LTRIM(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; 
    /

  16. #16
    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
    pas encore ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 1101000
    TRANSLATE_FR(TO_WORD_EN(1101000))
    ------------------------------------------------
    un million un cent mille

  17. #17
    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
    Citation Envoyé par Yorglaa
    sauf erreur, le problème du "zéro virgule cinq" vient de la fonction sous-jacente de to_word_en
    En effet, pour ce bug il fallait remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       IF NVL (lv$entier, 0) = 0 
       THEN 
          lv$mots_complets := 'zero' ;
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       IF NVL (lv$entier, 0) = 0 
       THEN 
          lv$mots_complets := 'zero' || lv$mots_complets;
    Et pour les 0 qui suivent le séparateur il fallait ajouter une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          FOR i IN 1..LENGTH(lv$partie_decimale)
          LOOP
             EXIT WHEN SUBSTR(lv$partie_decimale,i,1) <> 0;
     
             lv$mots_complets := ' zero ' || lv$mots_complets;
     
          END LOOP;
    Si vous me validez tout ça, la page source sera mise à jour ASAP

  18. #18
    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
    Citation Envoyé par Yorglaa
    Salut,
    sauf erreur, le problème du "zéro virgule cinq" vient de la fonction sous-jacente de to_word_en

    en passant par un to_date en calendrier julien, on ne peut pas avoir moins que 1 en entrée...
    il aurait donc été plus judicieux de choisir "SSSSSSp" (spell the seconds of the day) que "JSp" puisque SSSSS va de zéro à 86399 ;-)

  19. #19
    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
    reste à savoir si on veut vraiment avoir des mots complets après la virgule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SQL> SELECT translate_fr(to_word_en(&n)) FROM dual;
    Enter value for n: 1.100000001
    TRANSLATE_FR(TO_WORD_EN(1.100000001))
    -----------------------------------------------------
    un virgule un cent millions un
    moi je dirais plutôt un virgual un zéro zéro zéro zéro zéro zéro zéro un

    par contre, pour les chèques, je traduirais

    1.50 en un franc cinquante et pas un franc cinq

    et quand il s'agit d'argent, il vaut mieux que ce soit correct, non ;-)

  20. #20
    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
    [quote="laurentschneider"]pas encore ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 6 12345 ... DernièreDernière

Discussions similaires

  1. Ecrire un nombre en toutes lettres
    Par rambc dans le forum Général Python
    Réponses: 17
    Dernier message: 11/02/2010, 19h27
  2. [CR 8] Ecrire un nombre en toute lettre
    Par guandal dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/06/2009, 11h01
  3. [JavaScript] [SRC] afficher des nombres en toutes lettres
    Par javatwister dans le forum Contribuez
    Réponses: 2
    Dernier message: 07/09/2007, 13h23
  4. Réponses: 9
    Dernier message: 07/11/2006, 14h12

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