Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/02/2008, 10h41   #1
laurep
Invité de passage
 
Inscription : 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
laurep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 10h45   #2
LeoAnderson
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 940
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 940
Points : 3 028
Points : 3 028

http://www.developpez.net/forums/sho...iffres+lettres
http://www.developpez.net/forums/sho...iffres+lettres
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 10h45   #3
orafrance
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 857
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 857
Points : 16 697
Points : 16 697
http://oracle.developpez.com/sources...mbre_a_lettres
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 10h46   #4
laurentschneider
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 931
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 931
Points : 4 873
Points : 4 873
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...
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/02/2008, 10h49   #5
orafrance
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 857
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 857
Points : 16 697
Points : 16 697
par contre, va falloir que je m'occupe du bug de la virgule et des problèmes d'orthographe
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 14h02   #6
orafrance
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 857
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 857
Points : 16 697
Points : 16 697
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 14h50   #7
laurentschneider
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 931
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 931
Points : 4 873
Points : 4 873
moi je dirais quatre-vingt mille sans s à vingt
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 16h33   #8
orafrance
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 857
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 857
Points : 16 697
Points : 16 697
ha oui... mais quatre-vingts-millions

d'ailleurs, le trait d'union est aussi manquant
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 16h40   #9
laurep
Invité de passage
 
Inscription : février 2008
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 4
Points : 0
Points : 0
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
laurep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 16h48   #10
orafrance
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 857
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 857
Points : 16 697
Points : 16 697
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2009, 13h29   #11
b_adel7
Invité régulier
 
Inscription : juillet 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 10
Points : 5
Points : 5
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

Citation:
………….
, '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.
b_adel7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2012, 16h40   #12
maxine
Invité régulier
 
Inscription : novembre 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 24
Points : 8
Points : 8
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,
maxine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h33.


 
 
 
 
Partenaires

Hébergement Web