DBA Data[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