bonjours a tous
je veux convertir un montant d'une facture en toute lettre
merci d'avence pour votre aide
bonjours a tous
je veux convertir un montant d'une facture en toute lettre
merci d'avence pour votre aide
Hello,
En quelle langue ?
Tu peux peut etre t'inspirer de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select to_char(to_date(11221, 'J'), 'Jsp') from dual TO_CHAR(TO_DATE(11221,'J'),'JSP') -------------------------------------- Eleven Thousand Two Hundred Twenty-One 1 row selected.
Laly.
In the heart of the truly greats, perfection is never achieved but endlessly pursued.
Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)
Envoyé par Fred_D
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SQL> SELECT translate_fr(to_word_en(101000)) FROM dual; cent mille
euuuuh c'est pas pour dire... mais moi je vois cent UN mille en chiffres...Envoyé par laurentschneider
problème de copier-coller ?
c'est donc un bug dans la fonction référencée (par fred)
PS: désolé d'être aussi avare en commentaires, je voulais juste rendre attentif au fait que la fonction de traduction en français n'était pas 100% correcte![]()
Voila qui devrait régler le problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 code faux /
oui c'est mieux, mais je pense que ça doit encore être testéEnvoyé par Fred_D
8)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SQL> SELECT translate_fr(to_word_en(1001000)) FROM dual; un million un mille
l'orthographe aussi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 21000000 TRANSLATE_FR(TO_WORD_EN(21000000)) ------------------------------------------------- vingt et un million SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 20000000 TRANSLATE_FR(TO_WORD_EN(20000000)) ------------------------------------------------- vingt millions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 1.5 TRANSLATE_FR(TO_WORD_EN(1.5)) ------------------------------------------ un virgule cinq SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 0.5 TRANSLATE_FR(TO_WORD_EN(0.5)) ------------------------------------------ zero
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 1.01 TRANSLATE_FR(TO_WORD_EN(1.01)) ------------------------------------------- un virgule un SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 1.1 TRANSLATE_FR(TO_WORD_EN(1.1)) ------------------------------------------ un virgule un
Cool, j'ai un bon testeur là
Essaye ceci :
J'espère que ce coup ci, c'est la bonne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 KO /![]()
pour les décimales... je verrais plus tard, je ne suis pas l'auteur de to_word_en![]()
Salut,Envoyé par laurentschneider
sauf erreur, le problème du "zéro virgule cinq" vient de la fonction sous-jacente de to_word_en
en passant par un to_date en calendrier julien, on ne peut pas avoir moins que 1 en entrée...
et voila :
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 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$partie_decimale VARCHAR2 (255) := lv$decimales; 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; -- Annonce la décimale (remplacer par Euro pour les montants en euros par exemple) et les zéros avant le nombre significatif FOR i IN 1..LENGTH(lv$partie_decimale) LOOP EXIT WHEN SUBSTR(lv$partie_decimale,i,1) <> 0; lv$mots_complets := ' zero ' || lv$mots_complets; END LOOP; lv$mots_complets := ' point ' || LTRIM(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; /
pas encore ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 1101000 TRANSLATE_FR(TO_WORD_EN(1101000)) ------------------------------------------------ un million un cent mille
En effet, pour ce bug il fallait remplacer :Envoyé par Yorglaa
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IF NVL (lv$entier, 0) = 0 THEN lv$mots_complets := 'zero' ;
Et pour les 0 qui suivent le séparateur il fallait ajouter une boucle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IF NVL (lv$entier, 0) = 0 THEN lv$mots_complets := 'zero' || lv$mots_complets;
Si vous me validez tout ça, la page source sera mise à jour ASAP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 FOR i IN 1..LENGTH(lv$partie_decimale) LOOP EXIT WHEN SUBSTR(lv$partie_decimale,i,1) <> 0; lv$mots_complets := ' zero ' || lv$mots_complets; END LOOP;![]()
il aurait donc été plus judicieux de choisir "SSSSSSp" (spell the seconds of the day) que "JSp" puisque SSSSS va de zéro à 86399 ;-)Envoyé par Yorglaa
reste à savoir si on veut vraiment avoir des mots complets après la virgule.
moi je dirais plutôt un virgual un zéro zéro zéro zéro zéro zéro zéro un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SQL> SELECT translate_fr(to_word_en(&n)) FROM dual; Enter value for n: 1.100000001 TRANSLATE_FR(TO_WORD_EN(1.100000001)) ----------------------------------------------------- un virgule un cent millions un
par contre, pour les chèques, je traduirais
1.50 en un franc cinquante et pas un franc cinq
et quand il s'agit d'argent, il vaut mieux que ce soit correct, non ;-)
[quote="laurentschneider"]pas encore ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part KO![]()
Partager