Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 12/02/2008, 10h41   #1
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
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972

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
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 196
Points : 16 196
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
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 892
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 892
Points : 4 437
Points : 4 437
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 00
Vieux 12/02/2008, 10h49   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 196
Points : 16 196
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
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 196
Points : 16 196
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

Dernière modification par orafrance ; 12/02/2008 à 14h27.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2008, 14h50   #7
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 892
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 892
Points : 4 437
Points : 4 437
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
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 196
Points : 16 196
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
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
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 196
Points : 16 196
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
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.

Dernière modification par Deepin ; 11/11/2009 à 05h25. Motif: Merci d'utiliser la balise [code] (bouton #) de l'editeur.
b_adel7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2010, 19h07   #12
Invité de passage
 
mourad mekhlouf
Inscription : février 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : mourad mekhlouf

Informations forums :
Inscription : février 2010
Messages : 2
Points : 2
Points : 2
Citation:
Envoyé par laurep Voir le message
Bonjour,

Existe t il une fonction dans sql permettant de convertir un nombre en lettres?
Exemple: "1200" devient "mille deux cent"
Merci d'avance
mekhlouf_mourad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2010, 09h37   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 196
Points : 16 196
oui... et ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 03h50.


 
 
 
 
Partenaires

Hébergement Web