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
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
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 tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 li$nb_zero := length(TRANSLATE(SUBSTR (pn$nombre - lv$entier, 2),'123456789','x'))-1;
par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part RETURN lv$nombre_fr;
resultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part RETURN replace(lv$nombre_fr,'Un Cent','Cent');
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Par contre, va falloir que je m'attèle aux pluriels
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 ?
Edit : Bon... c'est quatre-vingt mille mais quatre-vingts millions
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 :
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
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 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.
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 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 ?
J'vais voir ça
il y a simplement une coquille avec TRANSLATE qui ne pouvait tenir compte que du 1.
remplace
Code : Sélectionner tout - Visualiser dans une fenêtre à part li$nb_zero := INSTR(TRANSLATE(SUBSTR(pn$nombre - lv$entier, 2),'123456789','xxxxxxxxx'),'x')-1;
Code : Sélectionner tout - Visualiser dans une fenêtre à part li$nb_zero := INSTR(TRANSLATE(SUBSTR(pn$nombre - lv$entier, 2),'123456789','x'),'x')-1;
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); 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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT translate_fr(to_word_en(1001000)) FROM dual; un million un mille
tu mets un s à un ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Pfff... alors là c'est la tuile Je m'en doutais en plus mais j'ai pas vérifié
Oui mais... non
Faut dire que l'idée c'est surtout de traduire des montants... et on voit rarement des montants non fini
Là je fait l'impasse
Et puis je ne fais que traduire les bêtises d'Oracle
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