[Home] [Help]
PACKAGE BODY: APPS.JG_ZZ_AMOUNT_IN_LETTERS
Source
1 PACKAGE BODY JG_ZZ_AMOUNT_IN_LETTERS AS
2 /* $Header: jgzztrlb.pls 115.8 2002/10/17 23:21:49 ashrivat ship $ */
3
4 ----------------------------------------------------------------------
5 --procedure es_init is
6 ----------------------------------------------------------------------
7 procedure sp_init is
8 begin
9 NumberList (0) :='cero';
10 NumberList (1) :='uno';
11 NumberList (2) :='dos';
12 NumberList (3) :='tres';
13 NumberList (4) :='cuatro';
14 NumberList (5) :='cinco';
15 NumberList (6) :='seis';
16 NumberList (7) :='siete';
17 NumberList (8) :='ocho';
18 NumberList (9) :='nueve';
19 NumberList (10) :='diez';
20 NumberList (11) :='once';
21 NumberList (12) :='doce';
22 NumberList (13) :='trece';
23 NumberList (14) :='catorce';
24 NumberList (15) :='quince';
25 NumberList (16) :='dieciseis';
26 NumberList (17) :='diecisiete';
27 NumberList (18) :='dieciocho';
28 NumberList (19) :='diecinueve';
29 NumberList (20) :='veinte';
30 NumberList (21) :='veintiuno';
31 NumberList (22) :='veintidos';
32 NumberList (23) :='veintitres';
33 NumberList (24) :='veinticuatro';
34 NumberList (25) :='veinticinco';
35 NumberList (26) :='veintiseis';
36 NumberList (27) :='veintisiete';
37 NumberList (28) :='veintiocho';
38 NumberList (29) :='veintinueve';
39 NumberList (30) :='treinta';
40 NumberList (31) :='treinta y uno';
41 NumberList (32) :='treinta y dos';
42 NumberList (33) :='treinta y tres';
43 NumberList (34) :='treinta y cuatro';
44 NumberList (35) :='treinta y cinco';
45 NumberList (36) :='treinta y seis';
46 NumberList (37) :='treinta y siete';
47 NumberList (38) :='treinta y ocho';
48 NumberList (39) :='treinta y nueve';
49 NumberList (40) :='cuarenta';
50 NumberList (41) :='cuarenta y uno';
51 NumberList (42) :='cuarenta y dos';
52 NumberList (43) :='cuarenta y tres';
53 NumberList (44) :='cuarenta y cuatro';
54 NumberList (45) :='cuarenta y cinco';
55 NumberList (46) :='cuarenta y seis';
56 NumberList (47) :='cuarenta y siete';
57 NumberList (48) :='cuarenta y ocho';
58 NumberList (49) :='cuarenta y nueve';
59 NumberList (50) :='cincuenta';
60 NumberList (51) :='cincuenta y uno';
61 NumberList (52) :='cincuenta y dos';
62 NumberList (53) :='cincuenta y tres';
63 NumberList (54) :='cincuenta y cuatro';
64 NumberList (55) :='cincuenta y cinco';
65 NumberList (56) :='cincuenta y seis';
66 NumberList (57) :='cincuenta y siete';
67 NumberList (58) :='cincuenta y ocho';
68 NumberList (59) :='cincuenta y nueve';
69 NumberList (60) :='sesenta';
70 NumberList (61) :='sesenta y uno';
71 NumberList (62) :='sesenta y dos';
72 NumberList (63) :='sesenta y tres';
73 NumberList (64) :='sesenta y cuatro';
74 NumberList (65) :='sesenta y cinco';
75 NumberList (66) :='sesenta y seis';
76 NumberList (67) :='sesenta y siete';
77 NumberList (68) :='sesenta y ocho';
78 NumberList (69) :='sesenta y nueve';
79 NumberList (70) :='setanta';
80 NumberList (71) :='setanta y uno';
81 NumberList (72) :='setanta y dos';
82 NumberList (73) :='setanta y tres';
83 NumberList (74) :='setanta y cuatro';
84 NumberList (75) :='setanta y cinco';
85 NumberList (76) :='setanta y seis';
86 NumberList (77) :='setanta y siete';
87 NumberList (78) :='setanta y ocho';
88 NumberList (79) :='setanta y nueve';
89 NumberList (80) :='ochenta';
90 NumberList (81) :='ochenta y uno';
91 NumberList (82) :='ochenta y dos';
92 NumberList (83) :='ochenta y tres';
93 NumberList (84) :='ochenta y cuatro';
94 NumberList (85) :='ochenta y cinco';
95 NumberList (86) :='ochenta y seis';
96 NumberList (87) :='ochenta y siete';
97 NumberList (88) :='ochenta y ocho';
98 NumberList (89) :='ochenta y nueve';
99 NumberList (90) :='noventa';
100 NumberList (91) :='noventa y uno';
101 NumberList (92) :='noventa y dos';
102 NumberList (93) :='noventa y tres';
103 NumberList (94) :='noventa y cuatro';
104 NumberList (95) :='noventa y cinco';
105 NumberList (96) :='noventa y seis';
106 NumberList (97) :='noventa y siete';
107 NumberList (98) :='noventa y ocho';
108 NumberList (99) :='noventa y nueve';
109 ThousandList (1) := 'cien';
110 ThousandList (2) := 'mil';
111 ThousandList (3) := 'millon';
112 ThousandList (4) := 'mil millon';
113 end;
114
115 ----------------------------------------------------------------------
116 --procedure fr_init is
117 ----------------------------------------------------------------------
118 procedure fr_init is
119 begin
120 NumberList (0) :='zero';
121 NumberList (1) :='un';
122 NumberList (2) :='deux';
123 NumberList (3) :='trois';
124 NumberList (4) :='quatre';
125 NumberList (5) :='cinq';
126 NumberList (6) :='six';
127 NumberList (7) :='sept';
128 NumberList (8) :='huit';
129 NumberList (9) :='neuf';
130 NumberList (10) :='dix';
131 NumberList (11) :='onze';
132 NumberList (12) :='douze';
133 NumberList (13) :='treize';
134 NumberList (14) :='quatorze';
135 NumberList (15) :='quinze';
136 NumberList (16) :='seize';
137 NumberList (17) :='dix-sept';
138 NumberList (18) :='dix-huit';
139 NumberList (19) :='dix-neuf';
140 NumberList (20) :='vingt';
141 NumberList (21) :='vingt-et-un';
142 NumberList (22) :='vingt-deux';
143 NumberList (23) :='vingt-trois';
144 NumberList (24) :='vingt-quatre';
145 NumberList (25) :='vingt-cinq';
146 NumberList (26) :='vingt-six';
147 NumberList (27) :='vingt-sept';
148 NumberList (28) :='vingt-huit';
149 NumberList (29) :='vingt-neuf';
150 NumberList (30) :='trente';
151 NumberList (31) :='trente-et-un';
152 NumberList (32) :='trente-deux';
153 NumberList (33) :='trente-trois';
154 NumberList (34) :='trente-quatre';
155 NumberList (35) :='trente-cinq';
156 NumberList (36) :='trente-six';
157 NumberList (37) :='trente-sept';
158 NumberList (38) :='trente-huit';
159 NumberList (39) :='trente-neuf';
160 NumberList (40) :='quarante';
161 NumberList (41) :='quarante-et-un';
162 NumberList (42) :='quarante-deux';
163 NumberList (43) :='quarante-trois';
164 NumberList (44) :='quarante-quatre';
165 NumberList (45) :='quarante-cinq';
166 NumberList (46) :='quarante-six';
167 NumberList (47) :='quarante-sept';
168 NumberList (48) :='quarante-huit';
169 NumberList (49) :='quarante-neuf';
170 NumberList (50) :='cinquante';
171 NumberList (51) :='cinquante-et-un';
172 NumberList (52) :='cinquante-deux';
173 NumberList (53) :='cinquante-trois';
174 NumberList (54) :='cinquante-quatre';
175 NumberList (55) :='cinquante-cinq';
176 NumberList (56) :='cinquante-six';
177 NumberList (57) :='cinquante-sept';
178 NumberList (58) :='cinquante-huit';
179 NumberList (59) :='cinquante-neuf';
180 NumberList (60) :='soixante';
181 NumberList (61) :='soixante-et-un';
182 NumberList (62) :='soixante-deux';
183 NumberList (63) :='soixante-trois';
184 NumberList (64) :='soixante-quatre';
185 NumberList (65) :='soixante-cinq';
186 NumberList (66) :='soixante-six';
187 NumberList (67) :='soixante-sept';
188 NumberList (68) :='soixante-huit';
189 NumberList (69) :='soixante-neuf';
190 NumberList (70) :='soixante-dix';
191 NumberList (71) :='soixante et onze';
192 NumberList (72) :='soixante-douze';
193 NumberList (73) :='soixante-treize';
194 NumberList (74) :='soixante-quatorze';
195 NumberList (75) :='soixante-quinze';
196 NumberList (76) :='soixante-seize';
197 NumberList (77) :='soixante-dix-sept';
198 NumberList (78) :='soixante-dix-huit';
199 NumberList (79) :='soixante-dix-neuf';
200 NumberList (80) :='quatre-vingt';
201 NumberList (81) :='quatre-vingt-un';
202 NumberList (82) :='quatre-vingt-deux';
203 NumberList (83) :='quatre-vingt-trois';
204 NumberList (84) :='quatre-vingt-quatre';
205 NumberList (85) :='quatre-vingt-cinq';
206 NumberList (86) :='quatre-vingt-six';
207 NumberList (87) :='quatre-vingt-sept';
208 NumberList (88) :='quatre-vingt-huit';
209 NumberList (89) :='quatre-vingt-neuf';
210 NumberList (90) :='quatre-vingt-dix';
211 NumberList (91) :='quatre-vingt-onze';
212 NumberList (92) :='quatre-vingt-douze';
213 NumberList (93) :='quatre-vingt-treize';
214 NumberList (94) :='quatre-vingt-quatorze';
215 NumberList (95) :='quatre-vingt-quinze';
216 NumberList (96) :='quatre-vingt-seize';
217 NumberList (97) :='quatre-vingt-dix-sept';
218 NumberList (98) :='quatre-vingt-dix-huit';
219 NumberList (99) :='quatre-vingt-dix-neuf';
220 ThousandList (1) := 'cent';
221 ThousandList (2) := 'mille';
222 ThousandList (3) := 'million';
223 ThousandList (4) := 'milliard';
224 end;
225
226 ----------------------------------------------------------------------
227 --procedure it_init
228 ----------------------------------------------------------------------
229
230 procedure it_init is
231
232 begin
233 NumberList (0) :='zero';
234 NumberList (1) :='uno';
235 NumberList (2) :='due';
236 NumberList (3) :='tre';
237 NumberList (4) :='quattro';
238 NumberList (5) :='cinque';
239 NumberList (6) :='sei';
240 NumberList (7) :='sette';
241 NumberList (8) :='otto';
242 NumberList (9) :='nove';
243 NumberList (10) :='dieci';
244 NumberList (11) :='undici';
245 NumberList (12) :='dodici';
246 NumberList (13) :='tredici';
247 NumberList (14) :='quattordici';
248 NumberList (15) :='quindici';
249 NumberList (16) :='sedici';
250 NumberList (17) :='diciassette';
251 NumberList (18) :='diciotto';
252 NumberList (19) :='diciannove';
253 NumberList (20) :='venti';
254 NumberList (21) :='ventuno';
255 NumberList (22) :='ventidue';
256 NumberList (23) :='ventitre';
257 NumberList (24) :='ventiquattro';
258 NumberList (25) :='venticinque';
259 NumberList (26) :='ventisei';
260 NumberList (27) :='ventisette';
261 NumberList (28) :='ventotto';
262 NumberList (29) :='ventinove';
263 NumberList (30) :='trenta';
264 NumberList (31) :='trentuno';
265 NumberList (32) :='trentadue';
266 NumberList (33) :='trentatre';
267 NumberList (34) :='trentaquattro';
268 NumberList (35) :='trentacinque';
269 NumberList (36) :='trentasei';
270 NumberList (37) :='trentasette';
271 NumberList (38) :='trentotto';
272 NumberList (39) :='trentanove';
273 NumberList (40) :='quaranta';
274 NumberList (41) :='quarantuno' ;
275 NumberList (42) :='quarantadue';
276 NumberList (43) :='quarantatre';
277 NumberList (44) :='quarantaquattro';
278 NumberList (45) :='quarantacinque';
279 NumberList (46) :='quarantasei';
280 NumberList (47) :='quarantasette';
281 NumberList (48) :='quarantotto';
282 NumberList (49) :='quarantanove';
283 NumberList (50) :='cinquanta';
284 NumberList (51) :='cinquantuno';
285 NumberList (52) :='cinquantadue';
286 NumberList (53) :='cinquantatre';
287 NumberList (54) :='cinquantaquattro';
288 NumberList (55) :='cinquantacinque';
289 NumberList (56) :='cinquantasei';
290 NumberList (57) :='cinquantasette';
291 NumberList (58) :='cinquantotto';
292 NumberList (59) :='cinquantanove';
293 NumberList (60) :='sessanta';
294 NumberList (61) :='sessantuno';
295 NumberList (62) :='sessantadue';
296 NumberList (63) :='sessantatre';
297 NumberList (64) :='sessantaquattro';
298 NumberList (65) :='sessantacinque';
299 NumberList (66) :='sessantasei';
300 NumberList (67) :='sessantasette';
301 NumberList (68) :='sessantotto';
302 NumberList (69) :='sessantanove';
303 NumberList (70) :='settanta ';
304 NumberList (71) :='settantuno';
305 NumberList (72) :='settantadue';
306 NumberList (73) :='settantatre';
307 NumberList (74) :='settantaquattro';
308 NumberList (75) :='settantacinque';
309 NumberList (76) :='settantasei';
310 NumberList (77) :='settantasette';
311 NumberList (78) :='settantotto';
312 NumberList (79) :='settantanove';
313 NumberList (80) :='ottanta';
314 NumberList (81) :='ottantuno';
315 NumberList (82) :='ottantadue';
316 NumberList (83) :='ottantatre';
317 NumberList (84) :='ottantaquattro';
318 NumberList (85) :='ottantacinque';
319 NumberList (86) :='ottantasei';
320 NumberList (87) :='ottantasette';
321 NumberList (88) :='ottantotto';
322 NumberList (89) :='ottantanove';
323 NumberList (90) :='novanta';
324 NumberList (91) :='novantuno';
325 NumberList (92) :='novantadue';
326 NumberList (93) :='novantatre';
327 NumberList (94) :='novantaquattro';
328 NumberList (95) :='novantacinque';
329 NumberList (96) :='novantasei';
330 NumberList (97) :='novantasette';
331 NumberList (98) :='novantotto';
332 NumberList (99) :='novantanove';
333 ThousandList (1) := 'cento';
334 ThousandList (2) := 'mille';
335 ThousandList (3) := 'milion';
336 ThousandList (4) := 'miliard';
337 end;
338
339
340 ----------------------------------------------------------------------
341 --function hundreds ( p_nb_char IN VARCHAR2 ) return VARCHAR2 IS
342 ----------------------------------------------------------------------
343
344 function hundreds ( p_nb_char IN VARCHAR2 ) return VARCHAR2 IS
345 v_in_number VARCHAR2 (100);
346 v_size NUMBER;
347 v_hundred VARCHAR2(1);
348 v_in_character VARCHAR2(500) := '';
349
350 BEGIN
351
352 v_in_number := p_nb_char;
353
354 if length (v_in_number) = 3 then
355 v_hundred := substr ( v_in_number , 1,1 );
356 if v_hundred not in ('0') then
360 v_in_number := substr ( v_in_number , 2 , 2 );
357 v_in_character := NumberList(to_number( v_hundred))||' ';
358 v_in_character := v_in_character || ThousandList(1) ||' ';
359 end if;
361 end if;
362
363 -- Remove the 0 on left side
364
365 v_in_number := ltrim ( v_in_number ,'0');
366 if v_in_number is not null then
367 v_in_character:=v_in_character||NumberList(to_number( v_in_number));
368 end if;
369 RETURN v_in_character;
370 END;
371
372 --------------------------------------------------------------------------------------------------
373 --function litteral(p_number IN NUMBER, p_decimal IN BOOLEAN, p_lang IN VARCHAR2) return VARCHAR2
374 --------------------------------------------------------------------------------------------------
375
376 function litteral ( p_number IN NUMBER , p_decimal IN BOOLEAN, p_lang IN VARCHAR2) return VARCHAR2 IS
377 v_in_number VARCHAR2 (100);
378 v_box VARCHAR2(3);
379 v_in_character VARCHAR2(500) := '';
380 v_level NUMBER := 1;
381 v_length_max NUMBER := 1;
382 v_label VARCHAR2(20);
383 BEGIN
384
385
386
387
388 -- initialization
389
390 if (p_lang = 'FR') then
391
392 fr_init;
393
394 elsif (p_lang = 'IT') then
395
396 it_init;
397
398 elsif (p_lang = 'ES') then
399
400
401 sp_init;
402
403
404 else
405
406
407 raise_application_error(-20001,'Unknown language');
408
409 end if;
410
411
412
413
414 --The string is cut in boxes of 3 numbers from the right.
415
416 v_in_number := ltrim(to_char(p_number),0);
417
418 if v_in_number is null then
419
420 v_in_character := NumberList(0);
421
422 else
423
424
425 Loop
426 v_length_max := 3 * v_level ;
427
428 if v_length_max < length (v_in_number)then
429 v_box := substr( v_in_number ,-v_length_max, 3);
430 else
431 v_box:= substr( v_in_number ,1,3-(v_length_max-length(v_in_number)));
432 end if;
433
434 if v_box is null then
435 EXIT;
436 end if;
437
438 --At the fisrt level there is no label
439
440 if v_level <> 1 then
441 if ltrim(v_box ,'0')is not null then
442 v_label := ThousandList(v_level) || ' ';
443 else
444 v_label := '';
445 end if;
446 end if;
447
448 v_in_character:=hundreds(v_box)||' '||v_label|| v_in_character ;
449 v_level := v_level + 1;
450 end loop;
451
452 end if;
453
454 v_in_character := rtrim (rtrim(v_in_character, '-' ));
455 v_in_character := replace( v_in_character ,' ',' ');
456
457 if p_lang = 'FR' then
458
459 v_in_character := fr_exceptions(v_in_character);
460 v_in_character := fr_plural(v_in_character);
461 v_in_character := fr_currency(v_in_character, p_decimal);
462
463 elsif p_lang = 'IT' then
464
465 v_in_character := it_exceptions(v_in_character);
466 v_in_character := it_plural(v_in_character);
467
468 elsif p_lang = 'ES' then
469
470 v_in_character := sp_exceptions(v_in_character);
471 v_in_character := sp_plural(v_in_character);
472
473 end if;
474
475
476 RETURN v_in_character;
477 END;
478
479
480 -----------------------------------------------------------------------------------
481 -- function litteral_amount(p_number IN NUMBER, p_lang IN VARCHAR2) return VARCHAR2
482 -----------------------------------------------------------------------------------
483
484 function litteral_amount(p_number IN NUMBER, p_lang IN VARCHAR2) return VARCHAR2 IS
485
486 v_whole_part NUMBER;
487 v_decimal_part NUMBER;
488 v_in_character VARCHAR2(250);
489
490 BEGIN
491
492 -- Separation in a whole part and a decimal part.
493 v_whole_part := floor (p_number);
494 v_decimal_part := floor ((p_number - v_whole_part )* 100 );
495
496
497
498 -- Verify the number is positive. Negative numbers get mucked up by the sign
499
500
501 if p_number < 0 then
502
503 raise_application_error(-20001,'Numerical value is less than zero :'|| p_number);
504
505 end if;
506
507
508 if p_lang = 'FR' then
509
510 if v_decimal_part <> 0 then
511 v_in_character := litteral(v_whole_part, FALSE, p_lang)||' '|| litteral(v_decimal_part, TRUE, p_lang)|| '.' ;
512 else
513 v_in_character := litteral(v_whole_part, FALSE, p_lang)|| '.' ;
514 end if;
515
516 elsif p_lang = 'IT' then
517
518
519 if v_decimal_part <> 0 then
520 v_in_character:=litteral(v_whole_part, FALSE, p_lang)||'/'||to_char(v_decimal_part)|| '.' ;
521 else
522 v_in_character:=litteral(v_whole_part, FALSE, p_lang)|| '.' ;
523 end if;
524
525
526
527 elsif p_lang = 'ES' then
528
529 if v_decimal_part <> 0 then
530 v_in_character:=litteral(v_whole_part, FALSE, p_lang)||'/'||to_char(v_decimal_part)|| '.' ;
531 else
532 v_in_character:=litteral(v_whole_part, FALSE, p_lang)|| '.' ;
536 raise_application_error(-20001 , 'Unknown language :'||p_lang);
533 end if;
534
535 else
537
538 end if;
539
540
541 v_in_character := ltrim (v_in_character );
542 -- First letter with uppercase
543 v_in_character := upper(substr(v_in_character,1,1))||substr(v_in_character,2);
544
545 return v_in_character;
546
547 END;
548
549 ----------------------------------------------------------------------
550 --function sp_exceptions (p_litteral IN VARCHAR2 ) return VARCHAR2
551 ----------------------------------------------------------------------
552
553 function sp_exceptions (p_litteral IN VARCHAR2 ) return VARCHAR2 IS
554
555 v_in_character VARCHAR2 (250);
556 v_pos NUMBER;
557
558 BEGIN
559
560 v_in_character := p_litteral;
561
562 --Build the string for the hundreds that have their own word in spanish
563
564 for i in 1..9
565 loop
566
567 if (i = 1) then
568
569 v_in_character := replace(v_in_character, NumberList(i)||' cien', 'cien');
570
571 elsif instr(v_in_character, NumberList(i)||' cien') <>0 then
572
573 v_in_character := replace(v_in_character, NumberList(i)||' cien', NumberList(i)||'cientos');
574
575 end if;
576
577 end loop;
578
579 v_in_character := replace(v_in_character,'cincocientos','quinientos');
580 v_in_character := replace(v_in_character,'sietecientos','setecientos');
581 v_in_character := replace(v_in_character,'nuevecientos','novecientos');
582
583 -- When the hundred is not multiplied and followed by a not null dizain/unit (ex : '123')
584 -- 'cien' should be 'ciento'
585
586 for i in 1..g_level
587 loop
588
589 v_pos := instr(v_in_character,'cien ',1,1) ;
590
591 if v_pos = 0 then
592 exit;
593 end if;
594
595 --if there is not null dizain/unit
596 if substr(v_in_character, v_pos + length('cien ') , 3) <> 'mil' then
597 v_in_character := substr(v_in_character, 1, v_pos - 1)||'ciento '||substr(v_in_character, v_pos + length('cien '));
598 end if;
599
600 end loop;
601
602 -- 'uno mil' should be 'un mil'
603 -- 'uno millon' should be 'un millon'
604 -- A string should not start whith 'un mil ' but with 'mil '
605
606 v_in_character := replace(v_in_character,'uno mil','un mil');
607
608 if instr(v_in_character, 'un mil ') = 1 then
609 v_in_character := replace(v_in_character,'un mil ','mil ');
610 end if;
611
612 -- 'millon' should be there only once
613
614 v_pos := instr(v_in_character, 'millon', 1, 2);
615
616 if v_pos <> 0 then
617 v_pos := instr(v_in_character, 'millon', 1, 1);
618 v_in_character := substr(v_in_character, 1 , v_pos - 1) || substr(v_in_character, v_pos + length('millon '));
619 end if;
620
621 return v_in_character;
622
623 END;
624
625 ----------------------------------------------------------------------
626 --function it_exceptions (p_litteral IN VARCHAR2 ) return VARCHAR2
627 ----------------------------------------------------------------------
628
629 function it_exceptions (p_litteral IN VARCHAR2 ) return VARCHAR2 IS
630
631 v_in_character VARCHAR2 (250);
632 v_replace BOOLEAN := FALSE;
633
634 BEGIN
635
636 -- No space between numbers in words in Italian
637
638 v_in_character := p_litteral;
639 v_in_character := replace (v_in_character, ' ');
640
641 -- 'unocento' should be 'cento'
642
643 v_in_character := replace ( v_in_character,'unocento', 'cento');
644
645 -- 'unomille' should be 'mille'
646
647 if instr(v_in_character, 'unomille') = 1 then
648 v_replace := TRUE;
649 end if;
650
651 for i in 3..g_level
652 loop
653
654 if instr(v_in_character, ThousandList(i)||'unomille')<> 0 then
655 v_replace := TRUE;
656 end if;
657 end loop;
658
659 if v_replace then
660 v_in_character := replace(v_in_character, 'unomille' , 'mille') ;
661 end if;
662
663 -- 'unomilione' should be 'unmilione' and 'unomiliardo' should be 'unmiliardo'
664
665 if instr(v_in_character, 'unomili') = 1 then
666 v_in_character := replace(v_in_character, 'unomili', 'unmili') ;
667 end if;
668
669 return v_in_character;
670
671 END;
672
673 ----------------------------------------------------------------------
674 --function it_plural (p_litteral IN VARCHAR2 ) return VARCHAR2
675 ----------------------------------------------------------------------
676
677 function it_plural (p_litteral IN VARCHAR2 ) return VARCHAR2 IS
678
679 v_in_character VARCHAR2 (250);
680 v_plural BOOLEAN:= TRUE;
681
682 BEGIN
683
684 v_in_character := p_litteral;
685
686 for i in 2..g_level
687 loop
688
689 if (i = 2) then
690 if instr(v_in_character , ThousandList(i)) = 1 then
691 v_plural := FALSE;
692 end if;
693
694 for j in 3..g_level
695 loop
696 if instr(v_in_character, ThousandList(j)||'mille')<> 0 then
697 v_plural := FALSE;
698 end if;
699 end loop;
700
701 if v_plural then
705 else
702 v_in_character := replace (v_in_character, 'mille', 'mila');
703 end if;
704
706
707 if instr(v_in_character, ThousandList(i)) <>0 then
708
709 if instr(v_in_character, 'un'||ThousandList(i)) <>0 then
710
711 if (i = 3) then
712 v_in_character := replace (v_in_character, ThousandList(i), ThousandList(i)||'e');
713 elsif (i= 4) then
714 v_in_character := replace (v_in_character, ThousandList(i), ThousandList(i)||'o');
715 end if;
716
717 else
718
719 v_in_character := replace (v_in_character, ThousandList(i), ThousandList(i)||'i');
720
721 end if;
722
723 end if;
724 end if;
725 end loop;
726
727 v_in_character := replace (v_in_character, 'tio', 'to');
728 v_in_character := replace (v_in_character, 'ao', 'o');
729 v_in_character := replace (v_in_character, 'iu', 'u');
730 v_in_character := replace (v_in_character, 'au', 'u');
731 v_in_character := replace (v_in_character, 'too', 'to');
732
733 return v_in_character;
734
735 END;
736
737 ----------------------------------------------------------------------
738 --function fr_plural (p_litteral IN VARCHAR2 ) return VARCHAR2
739 ----------------------------------------------------------------------
740
741 function fr_plural (p_litteral IN VARCHAR2 ) return VARCHAR2 IS
742 v_plural VARCHAR2(12);
743 l_size_plural NUMBER;
744 l_multiple VARCHAR2 (250);
745 v_in_character VARCHAR2 (250);
746 j NUMBER;
747 i NUMBER;
748 v_pos_multiple NUMBER;
749 v_concat_s BOOLEAN:= TRUE;
750
751 BEGIN
752
753 v_in_character := p_litteral;
754
755 -- Plural of 'quatre-vingt'
756
757 v_plural := NumberList(80);
758 l_size_plural:= length(v_plural);
759
760 if instr(substr(v_in_character ,-l_size_plural),v_plural)<> 0 then
761 v_in_character := v_in_character ||'s';
762 end if;
763
764 -- Plural for each level
765
766 for i in 1..g_level
767 loop
768 v_plural := ThousandList(i);
769 l_size_plural:= length(v_plural);
770
771 if (i = 1) then
772 if instr(substr(v_in_character ,-l_size_plural),v_plural )<> 0 then
773 --Check whether 'hundred' is multiplied
774 l_multiple:=ltrim(rtrim(substr(v_in_character ,1,length(v_in_character)- l_size_plural)));
775 if l_multiple is not null then
776
777 for j in 1..g_level
778 loop
779 v_pos_multiple:=instr(l_multiple, ThousandList(j),-1 );
780 if v_pos_multiple <> 0 and (length(l_multiple) - v_pos_multiple < 8) then
781 v_concat_s := FALSE;
782 end if;
783 end loop;
784 else
785 v_concat_s := FALSE;
786 end if;
787 else
788 v_concat_s := FALSE;
789 end if;
790 if v_concat_s then
791 v_in_character := v_in_character ||'s';
792 end if;
793 elsif (i = 3) or (i = 4) then
794 if substr(v_in_character, instr(v_in_character, v_plural) -3, 2)<>'un' then
795 v_in_character := replace(v_in_character, v_plural , v_plural ||'s' );
796 end if;
797 end if;
798 end loop;
799 return v_in_character;
800 END;
801 ----------------------------------------------------------------------
802 --function sp_plural (p_litteral IN VARCHAR2 ) return VARCHAR2
803 ----------------------------------------------------------------------
804
805 function sp_plural (p_litteral IN VARCHAR2 ) return VARCHAR2 IS
806
807 v_in_character VARCHAR2 (250);
808 v_pos NUMBER;
809 v_plural BOOLEAN:= TRUE;
810
811 BEGIN
812
813 v_in_character := p_litteral;
814
815 -- Plural of milone
816
817 v_pos := instr(v_in_character, ThousandList(3));
818
819 if v_pos > 3 then
820 v_in_character := replace(v_in_character , ThousandList(3), ThousandList(3)||'es');
821 end if;
822
823 return v_in_character;
824 END;
825
826 ----------------------------------------------------------------------
827 --function fr_exceptions (p_litteral IN VARCHAR2) return VARCHAR2 IS
828 ----------------------------------------------------------------------
829
830 function fr_exceptions (p_litteral IN VARCHAR2) return VARCHAR2 IS
831 v_in_character VARCHAR2(500);
832 v_replace BOOLEAN := FALSE;
833
834 BEGIN
835
836 v_in_character := p_litteral;
837
838 -- 'un cent' should be 'cent'
839
840 if instr(v_in_character, 'un cent') <> 0 then
841 v_in_character := replace ( v_in_character, 'un cent', 'cent');
842 end if;
843
844 -- 'un mille' should be 'mille'
845
846 if instr(v_in_character, 'un mille') = 1 then
847 v_replace := TRUE;
848 end if;
849
850 for i in 3..g_level
851 loop
852
853 if instr(v_in_character, ThousandList(i)||' '||'un mille')<> 0 then
854 v_replace := TRUE;
855 end if;
856 end loop;
857
858 if v_replace then
859 v_in_character := replace(v_in_character, 'un mille' , 'mille') ;
860 end if;
861
862 return v_in_character ;
863 END;
864
865 ----------------------------------------------------------------------
866 --function fr_currency (p_litteral IN VARCHAR2, p_decimal IN BOOLEAN) return VARCHAR2 IS
867 ----------------------------------------------------------------------
868
869 function fr_currency (p_litteral IN VARCHAR2, p_decimal IN BOOLEAN) return VARCHAR2 IS
870 v_article_l VARCHAR2(3) := ' d''';
871 v_article BOOLEAN:= FALSE;
872 v_plural BOOLEAN:= TRUE;
873 v_in_character VARCHAR2(250);
874
875 BEGIN
876
877 v_in_character := p_litteral;
878 -- Plural treatment
879 for i in 0..1
880 loop
881 if v_in_character = NumberList(i) then
882 v_plural := FALSE;
883 end if;
884 end loop;
885 if not p_decimal then
886 -- "Euros" should be prefixed by " d' " for amounts ending with million(s)/milliard(s).
887
888 for i in 3..g_level
889 loop
890
891 if instr(v_in_character , ThousandList(i)|| 's' ) <> 0 then
892
893 if substr(v_in_character, instr(v_in_character, ThousandList(i)||'s'))=
894 ThousandList(i)||'s' then
895
896 v_article := TRUE;
897
898 end if;
899
900 elsif instr(v_in_character, ThousandList(i))<> 0 then
901
902 if substr(v_in_character, instr(v_in_character, ThousandList(i)))= ThousandList(i) then
903
904 v_article := TRUE;
905
906 end if;
907
908 end if;
909
910 end loop;
911
912 if v_article then
913 v_in_character := v_in_character || v_article_l ||'Euros';
914 else
915 if v_plural then
916 v_in_character := v_in_character ||' Euros';
917 else
918 v_in_character := v_in_character ||' Euro';
919 end if;
920 end if;
921 else
922 -- traitement decimal
923 if v_plural then
924 v_in_character := v_in_character ||' Cents';
925 else
926 v_in_character := v_in_character ||' Cent';
927 end if;
928 end if;
929 return v_in_character;
930 END;
931
932 END;
933