Bonjour,
Existe t il une fonction dans sql permettant de convertir un nombre en lettres?
Exemple: "1200" devient "mille deux cent"
Merci d'avance
Version imprimable
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:
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 :oops:
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:
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 :bug:
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 ? :koi:
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 REPLACECode:
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,Citation:
………….
, '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é
parCode:lv$decimales VARCHAR2(255) := SUBSTR (pn$nombre - lv$entier, 2);
je sais que vous avez déjà compris l’intérêt.Code: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 centimesCode:
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 preneurCode:
1
2 > select TO_NUMBER(1000.20) from dual; 1000,2
merci,