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 (permalink)
Invité de passage
 
Date d'inscription: février 2008
Messages: 4
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
Vieux 12/02/2008, 10h45   #2 (permalink)
Expert Confirmé Sénior
 
Avatar de LeoAnderson
 
Date d'inscription: septembre 2004
Messages: 2 940
Par défaut


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
Vieux 12/02/2008, 10h45   #3 (permalink)
Responsable SGBD
 
Avatar de orafrance
 
Date d'inscription: janvier 2004
Âge: 32
Messages: 15 403
Par défaut

http://oracle.developpez.com/sources...mbre_a_lettres
orafrance est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 12/02/2008, 10h46   #4 (permalink)
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Date d'inscription: décembre 2005
Localisation: Suisse
Messages: 2 590
Par défaut

il n'y a pas ce genre de fonction en français, seulement en anglais avec quelque chose du style
Code :
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
Vieux 12/02/2008, 10h49   #5 (permalink)
Responsable SGBD
 
Avatar de orafrance
 
Date d'inscription: janvier 2004
Âge: 32
Messages: 15 403
Par défaut

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
Vieux 12/02/2008, 14h02   #6 (permalink)
Responsable SGBD
 
Avatar de orafrance
 
Date d'inscription: janvier 2004
Âge: 32
Messages: 15 403
Par défaut

j'ai corrigé le bug des zeros, la page source sera mise à jour très vite :
Code :
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
Vieux 12/02/2008, 14h50   #7 (permalink)
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Date d'inscription: décembre 2005
Localisation: Suisse
Messages: 2 590
Par défaut

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
Vieux 12/02/2008, 16h33   #8 (permalink)
Responsable SGBD
 
Avatar de orafrance
 
Date d'inscription: janvier 2004
Âge: 32
Messages: 15 403
Par défaut

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
Vieux 12/02/2008, 16h40   #9 (permalink)
Invité de passage
 
Date d'inscription: février 2008
Messages: 4
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
laurep est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 12/02/2008, 16h48   #10 (permalink)
Responsable SGBD
 
Avatar de orafrance
 
Date d'inscription: janvier 2004
Âge: 32
Messages: 15 403
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/11/2009, 13h29   #11 (permalink)
Invité régulier
 
Date d'inscription: juillet 2008
Messages: 10
Par défaut

bonjour
d’abord merci pour ces efforts
juste une petite contribution
1)
à la place de
Code :
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 buns ; 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
Vieux 22/02/2010, 19h07   #12 (permalink)
Invité de passage
 
Nom : mourad mekhlouf
Date d'inscription: février 2010
Messages: 2
Par défaut

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
Vieux 23/02/2010, 09h37   #13 (permalink)
Responsable SGBD
 
Avatar de orafrance
 
Date d'inscription: janvier 2004
Âge: 32
Messages: 15 403
Par défaut

oui... et ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ORACLEF.A.Q ORACLETUTORIELS ORACLETUTORIELS SQLSCRIPTS SQLLIVRES ORACLEQUIZBLOG ORACLE

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter



Outils de la discussion

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

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 07h03.


Vos questions techniques : forum d'entraide Oracle - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.