Bonjour,
svp connaissez-vous une fonction en sql permettant de convertir des chiffres en lettres? ou bien quelqu'un en a-t-il un à me proposer? par exemple: convertir "1585" en "mille cinq cent quatre vingts cinq".*
Merci
Version imprimable
Bonjour,
svp connaissez-vous une fonction en sql permettant de convertir des chiffres en lettres? ou bien quelqu'un en a-t-il un à me proposer? par exemple: convertir "1585" en "mille cinq cent quatre vingts cinq".*
Merci
:faq:
Pardon, c'est pas la FAQ, Mais une recherche (Nombre lettre) aurait donné un gros post
Voici le lien final :
http://oracle.developpez.com/sources...mbre_a_lettres
note que 1585, en lettres ça fait
mille cinq cent quatre-vingt cinq
(pas de s à vingt)
dans la fonction d'orafrance, il y a aussi quelques erreurs de pluriel, minimes...
les virgules par contre ne marchent pas du toutCode:
1
2
3
4
5
6
7
8
9 SELECT translate_fr(to_word_en(8e4)) FROM dual; quatre-vingts mille SELECT translate_fr(to_word_en(1e36)) FROM dual; un undecillions SELECT translate_fr(to_word_en(101e33)) FROM dual; cent un decillion
Code:
1
2
3
4
5
6 SELECT translate_fr(to_word_en(0.10)) FROM dual; zero SELECT translate_fr(to_word_en(1.01)) FROM dual; un virgule un
bonjour,
merci pour cette fonction
pour le problem des virgules voiçi la modif que j'ai fais:
j'ai remplacer dans la fonction to_word_en
par :Code:li$nb_zero := INSTR(TRANSLATE(SUBSTR (pn$nombre - lv$entier, 2),'123456789','x'),'x')-1;
aussi dans la fonction translate_fr j'ai ramplacer :Code:
1
2 li$nb_zero := length(TRANSLATE(SUBSTR (pn$nombre - lv$entier, 2),'123456789','x'))-1;
par :Code:RETURN lv$nombre_fr;
resultat:Code:RETURN replace(lv$nombre_fr,'Un Cent','Cent');
Code:
1
2
3
4
5 SELECT translate_fr(to_word_en(0.10)) FROM dual; zero virgule Un SELECT translate_fr(to_word_en(1.01)) FROM dual; Un virgule zero Un
Note que le problème de virgule est déjà résolu dans la source ;)
J'ai un peu travaillé depuis 2007 quand même :mouarf:
Par contre, va falloir que je m'attèle aux pluriels :oops:
quatre-vingts mille ne s'écrit pas comme ça ? 80 est rond donc un s non ?
deux cents mille s'écrit bien comme ça aussi non ? :oops:
Edit : Bon... c'est quatre-vingt mille mais quatre-vingts millions :calim2:
Si vingt ou cent ne sont pas les derniers mots, ils ne prennent pas de 's'. Simple et sans exception.;)
Non, ce n'est pas si simple : http://www.francaisfacile.com/exerci...ncais-3211.php
Exemple :
:mouarf:Citation:
Ce film a rapporté près de quatre-VINGTS millions d'euro(s).
Explications: pluriel (exception) car 80 n'est suivi d'aucun cardinal numéral (million n'est pas un cardinal numéral : c'est un nom).
Cette pétition a obtenu plus de quatre-VINGT mille signatures.
Explications: invariable, car 80 est suivi d'un cardinal numéral (mille est un cardinal numéral, contrairement à million qui est un nom).
Si vous pouviez me tester ceci :
ce serait bien aimable... tout va bien selon moi :oops: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
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 CREATE OR REPLACE FUNCTION 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( pn$nombre_en , '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 ' ) , '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; /
Je me suis mal exprimé, mais la règle est bel et bien simple et sans exception.
"Si vingt ou cent ne sont pas les derniers mots du nombre ou représentant un nombre, ils ne prennent pas de 's'."
Mille est un nombre, million n'en est pas un.:D
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 SQL> SELECT translate_fr(to_word_en(0.1)) FROM dual; TRANSLATE_FR(TO_WORD_EN(0.1)) ------------------------------------------------------ zero virgule un SQL> SELECT translate_fr(to_word_en(0.01)) FROM dual; TRANSLATE_FR(TO_WORD_EN(0.01)) ------------------------------------------------------ zero virgule zero un SQL> SELECT translate_fr(to_word_en(0.02)) FROM dual; TRANSLATE_FR(TO_WORD_EN(0.02)) ------------------------------------------------------ zero virgule deux SQL> SELECT translate_fr(to_word_en(0.2)) FROM dual; TRANSLATE_FR(TO_WORD_EN(0.2)) ------------------------------------------------------ zero virgule deux
Bon... il est où le bouton pour bannir un membre ? :mrgreen:
J'vais voir ça :calim2:
:merci:
il y a simplement une coquille avec TRANSLATE qui ne pouvait tenir compte que du 1.
remplaceCode:li$nb_zero := INSTR(TRANSLATE(SUBSTR(pn$nombre - lv$entier, 2),'123456789','xxxxxxxxx'),'x')-1;
Code:li$nb_zero := INSTR(TRANSLATE(SUBSTR(pn$nombre - lv$entier, 2),'123456789','x'),'x')-1;
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); li$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; --ajoute les zeros après la virgule li$nb_zero := INSTR(TRANSLATE(SUBSTR(pn$nombre - lv$entier, 2),'123456789','xxxxxxxxx'),'x')-1; IF li$nb_zero > 0 THEN FOR i IN 1..li$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; /
Tu vas sûrement trouver un article de la chartre pour me bannir... mais en attendant moi j'aurais mis un s à cent :mrgreen:
Code:
1
2 SELECT translate_fr(to_word_en(200000000)) FROM dual; deux cent millions
juste pour te donner du boulot jusqu'en 2011, voici encore un s de trop à million :aie:
Code:
1
2
3 SELECT translate_fr(to_word_en(0.01000001)) FROM dual; zero virgule zero un millions un
pas de language SMS dans les fonctions
:nosms:
Code:
1
2
3 SELECT translate_fr(to_word_en(1001000)) FROM dual; un million un mille
tu mets un s à un ?
Code:
1
2 SELECT translate_fr(to_word_en(1001000000)) FROM dual; un milliard un millions
je dois aussi dire que les grands chiffres c'est pas au point :oops:
1e0 ==> un
1e3 ==> mille
1e6 ==> un million
1e9 ==> un milliard
1e12 ==> un billion
1e15 ==> un billiard
1e18 ==> un trillion
1e21 ==> un trilliard
1001001001001001001001 = un trilliard un trillion un billiard un billion un milliard un million mille un
Code:
1
2
3
4
5 SELECT translate_fr(to_word_en(1001001001001001001001)) FROM dual; un sextillion un cintillions un quadrillions un trillions un milliards un millions un mille un SELECT translate_fr(to_word_en(1000000000000.1000)) FROM dual; mille milliards de mille sabords
et que faire de la traduction de to_word_en(1/9) ?
note que l'on dit rarement
trois virgule quatorze cintillions cent cinquante-neuf quadrillions deux cent soixante-cinq trillions trois cent cinquante-huit milliards neuf cent soixante-dix-neuf millions trois cent vingt-trois mille huit cent quarante-six
mais plutôt
trois virgule un quatre un cinq neuf deux six cinq trois cinq huit neuf sept neuf trois deux trois huit quatre six deux ...
voire
pi
Tu dis comment ? Un million et un mille ou un million mille... j'avoue ne pas le dire souvent :mouarf:
Pfff... alors là c'est la tuile :calim2: Je m'en doutais en plus mais j'ai pas vérifié :traine:
Oui mais... non :mrgreen:
Faut dire que l'idée c'est surtout de traduire des montants... et on voit rarement des montants non fini :calim2:
Là je fait l'impasse :P
Et puis je ne fais que traduire les bêtises d'Oracle :mouarf: