Bonjour,
Existe t il une fonction dans sql permettant de convertir un nombre en lettres?
Exemple: "1200" devient "mille deux cent"
Merci d'avance
Bonjour,
Existe t il une fonction dans sql permettant de convertir un nombre en lettres?
Exemple: "1200" devient "mille deux cent"
Merci d'avance
il n'y a pas ce genre de fonction en français, seulement en anglais avec quelque chose du style
dans le tutorial Oracle tu trouveras une fonction qui devrait bien te servir...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
par contre, va falloir que je m'occupe du bug de la virgule et des problèmes d'orthographe
j'ai corrigé le bug des zeros, la page source sera mise à jour très vite :
Edit : la page source est à jour et le pluriel était déjà OK
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 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; /
moi je dirais quatre-vingt mille sans s à vingt
ha oui... mais quatre-vingts-millions
d'ailleurs, le trait d'union est aussi manquant
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
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
bonjour
d’abord merci pour ces efforts
juste une petite contribution
1)
à la place de
Moi j’ai juste ajouté un REPLACE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IF SUBSTR(lv$nombre_fr,1,8)='un mille' THEN lv$nombre_fr := SUBSTR(lv$nombre_fr,4); END IF;
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,………….
, 'cent un mille' , 'cent un mille' )
, ’un cent’ , ‘cent’ )
, ‘un mille’ , ‘mille’ )
……..
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é
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part lv$decimales VARCHAR2(255) := SUBSTR (pn$nombre - lv$entier, 2);
je sais que vous avez déjà compris l’intérêt.
Code : Sélectionner tout - Visualiser dans une fenêtre à part lv$decimales VARCHAR2 (255) := SUBSTR (to_char(pn$nombre - lv$entier,'9D00'), -pn$precision);
Cela fonctionne bien mais j'ai un petit soucis avec des nombres comme 100.20
ainsi:
alors que je m'attends à one thousand point twenty car avec des montants, c'est vingt centimes et pas deux centimes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 > select to_word_en(1000.20) from dual one thousand point two
le soucis semble venir du TO_NUMBER qui tronque la partie après la virgule
Si quelqu'un a des idées, je suis preneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 > select TO_NUMBER(1000.20) from dual; 1000,2
merci,
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager