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,
Deux centimes serait "one thousand point zero two". Ne pas confontre "10.2 euros" et "10 euro et 2 centimes" (qui s'écrit 10.02 euros) !
J'ai le même problème avec une demande de x euro(s) et y centime(s). Il faut alors faire 2 traductions : partie entière puis partie décimal*100.
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 CREATE OR REPLACE FUNCTION montant_en_toutes_lettres(pn$nombre IN VARCHAR2) RETURN VARCHAR2 AS lv$entier NUMBER := TRUNC( TO_NUMBER( REPLACE(pn$nombre, ' ', ''))); lv$decimales NUMBER := (pn$nombre - lv$entier) *100; lv$mots_complets VARCHAR2 (4000) := null; BEGIN -- lv$mots_complets := translate_fr(to_word_en(lv$entier)) || ' euro'; IF lv$entier>1 THEN lv$mots_complets := lv$mots_complets || 's'; end if; -- lv$mots_complets := lv$mots_complets || ' et ' || translate_fr(to_word_en(lv$decimales)) || ' centime'; IF lv$decimales>1 THEN lv$mots_complets := lv$mots_complets || 's'; end if; -- RETURN trim(regexp_replace(lv$mots_complets,'\s+',' ')); END ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select montant_en_toutes_lettres(1000.20) from dual mille euros et vingt centimes
Petites corrections pour prendre en compte les nombres négatifs, et sur la traduction de "un mille" en "mille".
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
114 CREATE OR REPLACE FUNCTION GESSI.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 (abs(pn$nombre), ' ', ''))); lv$decimales VARCHAR2 (255) := SUBSTR (abs(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 (abs(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; IF pn$nombre<0 THEN lv$mots_complets := 'minus ' || lv$mots_complets; END IF; RETURN lv$mots_complets; END to_word_en; /
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169 CREATE OR REPLACE FUNCTION GESSI.translate_fr(pn$nombre_en IN VARCHAR2) RETURN VARCHAR2 AS lv$nombre_fr VARCHAR2(255); BEGIN lv$nombre_fr := REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( pn$nombre_en , 'minus' , 'moins' ) , 'million' , 'millions' ) , 'billion' , 'milliards' ) , 'trillion' , 'trillions' ) , 'quadrillion' , 'quadrillions' ) , 'quintillion' , 'cintillions' ) , 'sextillion' , 'sextillions' ) , 'septillion' , 'septillions' ) , 'octillion' , 'octillions' ) , 'nonillion' , 'nonillions' ) , 'decillion' , 'decillions' ) , 'thousand' , 'mille' ) , 'hundred' , 'cent' ) , 'ninety' , 'quatre-vingt-dix') , 'eighty' , 'quatre-vingts' ) , 'seventy' , 'soixante-dix' ) , 'sixty' , 'soixante' ) , 'fifty' , 'cinquante' ) , 'forty' , 'quarante' ) , 'thirty' , 'trente' ) , 'twenty' , 'vingt' ) , 'nineteen' , 'dix-neuf' ) , 'eighteen' , 'dix-huit' ) , 'seventeen' , 'dix-sept' ) , 'sixteen' , 'seize' ) , 'fifteen' , 'quinze' ) , 'fourteen' , 'quatorze' ) , 'thirteen' , 'treize' ) , 'twelve' , 'douze' ) , 'eleven' , 'onze' ) , 'ten' , 'dix' ) , 'nine' , 'neuf' ) , 'eight' , 'huit' ) , 'seven' , 'sept' ) , 'five' , 'cinq' ) , 'four' , 'quatre' ) , 'three' , 'trois' ) , 'two' , 'deux' ) , 'one' , 'un' ) , 'dix-six' , 'seize' ) , 'dix-cinq' , 'quinze' ) , 'dix-quatre' , 'quatorze' ) , 'dix-trois' , 'treize' ) , 'dix-deux' , 'douze' ) , 'dix-un' , 'onze' ) , '-un ' , '-une ' ) , 'un cent' , 'cent' ) , 'une' , 'un' ) , 'soixante-onze' , 'soixante et onze') , 'quatre-vingts-' , 'quatre-vingt-' ) , '-un' , ' et un' ) , 'quatre-vingt et un', 'quatre-vingt-un' ) , 'deux cent' , 'deux cents' ) , 'trois cent' , 'trois cents' ) , 'quatre cent' , 'quatre cents' ) , 'cinq cent' , 'cinq cents' ) , 'six cent' , 'six cents' ) , 'sept cent' , 'sept cents' ) , 'huit cent' , 'huit cents' ) , 'neuf cent' , 'neuf cents' ) , 'cents ' , 'cent ' ) , 'un mille' , 'mille' ) , 'vingts mille' , 'vingt mille' ) , 'un millions' , 'un million' ) , 'un bidecillions' , 'un bidecillion' ) , 'un cintillions' , 'un cintillion' ) , 'un milliards' , 'un milliard' ) , 'un trillions' , 'un trillion' ) , 'un quadrillions' , 'un quadrillion' ) , 'un sextillions' , 'un sextillion' ) , 'un septillions' , 'un septillion' ) , 'un octillions' , 'un octillion' ) , 'un nonillions' , 'un nonillion' ) , 'un decillions' , 'un decillion' ) , 'un undecillions' , 'un undecillion' ) , 'un duodecillions' , 'un duodecillion' ) , 'un tridecillions' , 'un tridecillion' ) , 'un quaddecillions' , 'un quaddecillion' ) , 'un quindecillions' , 'un quindecillion' ) , 'un sexdecillions' , 'un sexdecillion' ) , 'un septdecillions' , 'un septdecillion' ) , 'un octdecillions' , 'un octdecillion' ) , 'un nondecillions' , 'un nondecillion' ) , 'un dedecillions' , 'un dedecillion' ) , '-un trillion' , '-un trillions' ) , '-un quadrillion' , '-un quadrillions' ) , '-un sextillion' , '-un sextillions' ) , '-un septillion' , '-un septillions' ) , '-un octillion' , '-un octillions' ) , '-un nonillion' , '-un nonillions' ) , '-un decillion' , '-un decillions' ) , '-un undecillion' , '-un undecillions' ) , '-un duodecillion' , '-un duodecillions' ) , '-un tridecillion' , '-un tridecillions' ) , '-un quaddecillion' , '-un quaddecillions') , '-un quindecillion' , '-un quindecillions') , '-un sexdecillion' , '-un sexdecillions' ) , '-un septdecillion' , '-un septdecillions') , '-un octdecillion' , '-un octdecillions' ) , '-un nondecillion' , '-un nondecillions' ) , '-un dedecillion' , '-un dedecillions' ) , '-un million' , '-un millions' ) , '-un bidecillion' , '-un bidecillions') , '-un cintillion' , '-un cintillions' ) , '-un milliard' , '-un milliards' ) , 'point' , 'virgule' ) ,' ',' '); IF SUBSTR(lv$nombre_fr,1,8)='un mille' THEN lv$nombre_fr := SUBSTR(lv$nombre_fr,4); END IF; IF lv$nombre_fr LIKE '% un %illion %' OR lv$nombre_fr LIKE '% un %illiard %' THEN lv$nombre_fr := REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( lv$nombre_fr , ' un trillion' , ' un trillions' ) , ' un quadrillion' , ' un quadrillions' ) , ' un sextillion' , ' un sextillions' ) , ' un septillion' , ' un septillions' ) , ' un octillion' , ' un octillions' ) , ' un nonillion' , ' un nonillions' ) , ' un decillion' , ' un decillions' ) , ' un undecillion' , ' un undecillions' ) , ' un duodecillion' , ' un duodecillions' ) , ' un tridecillion' , ' un tridecillions' ) , ' un quaddecillion' , ' un quaddecillions') , ' un quindecillion' , ' un quindecillions') , ' un sexdecillion' , ' un sexdecillions' ) , ' un septdecillion' , ' un septdecillions') , ' un octdecillion' , ' un octdecillions' ) , ' un nondecillion' , ' un nondecillions' ) , ' un dedecillion' , ' un dedecillions' ) , ' un million' , ' un millions' ) , ' un bidecillion' , ' un bidecillions') , ' un cintillion' , ' un cintillions' ) , ' un milliard' , ' un milliards' ) ; END IF; RETURN lv$nombre_fr; END translate_fr; /
Hmm,
Tu as déterré un sujet vieux de 13 ans
Partager