Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / число прописью / 14 сообщений из 14, страница 1 из 1
22.12.2009, 22:22
    #36380997
число прописью
Код: plaintext
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.
with
a as (select  914767000873534524591281095 . 29663057631  num from dual),
nums as (
select  1  num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select  2 , ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select  3 , ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select  4 , ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select  5 , ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select  6 , ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select  7 , ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select  8 , ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select  9 , ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select  1  num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select  2 , ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select  3 , ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select  4 , ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select  5 , ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select  6 , ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select  7 , ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select  8 , ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select  9 , ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select  10 , ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select  11 , ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
b as (select floor(num) part1, to_number(substr(to_char(num-floor(num)), 2 )) part2, length(substr(to_char(num-floor(num)), 2 )) part2_len from a),
c as (
  select
    1  part,
   level- 1  lvl,
   case when level- 1 = 0  then 'Ы' when level- 1 = 1  then 'F' else 'M' end s,
   mod(floor(part1/power( 1000 ,level- 1 )), 1000 ) trinum
  from b connect by level<= 11 
  union all
  select
    2  part,
   level- 1  lvl,
   case when level- 1 = 0  then 'F' when level- 1 = 1  then 'F' else 'M' end s,
   mod(floor(part2/power( 1000 ,level- 1 )), 1000 ) trinum
  from b connect by level<= 11 
),
d as (
select part, lvl, s, trinum,
  case when trinum= 0  then  0 
       when mod(trinum, 100 ) between  5  and  19  then  5 
       when mod(trinum, 10 ) between  2  and  4  then  2 
       when mod(trinum, 10 )= 1  then  1 
       else  5 
  end power
from c),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, h.hundr
  || case when t.num= 1  and n.num> 0  then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power, 1 ,p.power1, 2 ,p.power2, 5 ,p.power5)
  || case when d.part= 1  and d.lvl= 0  then
     (select ' ' || decode(d.power, 1 ,decode(d.s,'M','целый','F','целая','целое'), 2 ,'целых', 5 ,'целых')
      from b where b.part2_len> 0 )
     end
  || case when d.part= 2  and d.lvl= 0  then
     (select ' ' ||
       case b.part2_len
        when  1  then decode(d.power, 1 ,'десятая', 2 ,'десятых', 5 ,'десятых')
        when  2  then decode(d.power, 1 ,'сотая', 2 ,'сотых', 5 ,'сотых')
        else decode(mod(b.part2_len, 3 ), 1 ,'десяти', 2 ,'сто') || decode(d.power, 1 ,m.power_1, 2 ,m.power_2, 5 ,m.power_2)
       end 
      from b
       left join pows m on m.num=floor(b.part2_len/ 3 ))
     end text
from d
  left join nums h on h.num=floor(d.trinum/ 100 )
  left join nums t on t.num=mod(floor(d.trinum/ 10 ), 10 )
  left join nums n on n.num=mod(d.trinum, 10 )
  left join pows p on p.num=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() s
from e order by rn
...
Рейтинг: 0 / 0
22.12.2009, 22:25
    #36381004
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
Про Йобибайт то забыли!
...
Рейтинг: 0 / 0
22.12.2009, 22:28
    #36381008
число прописью
mcureenab,

спасибо, я учту =)
...
Рейтинг: 0 / 0
22.12.2009, 23:43
    #36381075
число прописью
Код: plaintext
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.
with
a as (select  914760000873534524591281093 . 29663057635  num from dual),
nums as (
select  1  num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select  2 , ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select  3 , ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select  4 , ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select  5 , ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select  6 , ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select  7 , ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select  8 , ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select  9 , ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select  1  num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select  2 , ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select  3 , ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select  4 , ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select  5 , ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select  6 , ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select  7 , ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select  8 , ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select  9 , ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select  10 , ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select  11 , ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select  1  num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select  2 , 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select  5 , 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
b as (select floor(num) part1, to_number(substr(to_char(num-floor(num)), 2 )) part2, length(substr(to_char(num-floor(num)), 2 )) part2_len from a),
c as (
  select
    1  part,
   level- 1  lvl,
   case when level- 1 = 0  then 'Ы' when level- 1 = 1  then 'F' else 'M' end s,
   mod(floor(part1/power( 1000 ,level- 1 )), 1000 ) trinum
  from b connect by level<= 11 
  union all
  select
    2  part,
   level- 1  lvl,
   case when level- 1 = 0  then 'F' when level- 1 = 1  then 'F' else 'M' end s,
   mod(floor(part2/power( 1000 ,level- 1 )), 1000 ) trinum
  from b connect by level<= 11 
),
d as (
select part, lvl, s, trinum,
  case when trinum= 0  then  0 
       when mod(trinum, 100 ) between  5  and  19  then  5 
       when mod(trinum, 10 ) between  2  and  4  then  2 
       when mod(trinum, 10 )= 1  then  1 
       else  5 
  end power
from c),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, h.hundr
  || case when t.num= 1  and n.num> 0  then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power, 1 ,p.power1, 2 ,p.power2, 5 ,p.power5)
  || case when d.part= 1  and d.lvl= 0  then
     (select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
      from b, sfx s
      where s.num(+)=d.power and b.part2_len> 0 )
     end
  || case when d.part= 2  and d.lvl= 0  then
     (select ' ' ||
       decode(b.part2_len, 1 ,s1.part2_1, 2 ,s1.part2_2,s2.part2_pow||decode(d.power, 1 ,p.power_1, 2 ,p.power_2, 5 ,p.power_2))
      from b, pows p, sfx s1, sfx s2
      where p.num(+)=floor(b.part2_len/ 3 ) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len, 3 ))
     end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/ 100 )
  and t.num(+)=mod(floor(d.trinum/ 10 ), 10 )
  and n.num(+)=mod(d.trinum, 10 )
  and p.num(+)=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn
...
Рейтинг: 0 / 0
23.12.2009, 10:41
    #36381516
А по проще
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
Код: plaintext
1.
2.
3.
4.
with
a as (select  1  num from dual),
nums as (
...
Код: plaintext
 одно нониллионов октиллионов септиллионов секстиллионов квинтиллионов квадриллионов триллионов миллиардов миллионов тысяч
...
Рейтинг: 0 / 0
23.12.2009, 13:17
    #36382009
число прописью
А по проще,

спасибо большое. стратил таки на преобразовании в строку :(
Код: plaintext
b as (select floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)), 2 )), 0 ) part2, length(substr(to_char(num-floor(num)), 2 )) part2_len from a)
...
Рейтинг: 0 / 0
23.12.2009, 13:29
    #36382049
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
еще см. stff числа прописью
...
Рейтинг: 0 / 0
23.12.2009, 16:34
    #36382654
число прописью
orawish,

спасибо, я видел :)

последний вариант, исправлен ещё и 0

Код: plaintext
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.
with
a as (select  0  num, 'I' sex from dual),
b as (select sex, floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)), 2 )), 0 ) part2, length(substr(to_char(num-floor(num)), 2 )) part2_len from a),
c as (
  select
    1  part,
   level- 1  lvl,
   case when level- 1 = 0  then sex when level- 1 = 1  then 'F' else 'M' end s,
   mod(floor(part1/power( 1000 ,level- 1 )), 1000 ) trinum
  from b connect by level<= 11 
  union all
  select
    2  part,
   level- 1  lvl,
   case when level- 1 = 0  then 'F' when level- 1 = 1  then 'F' else 'M' end s,
   mod(floor(part2/power( 1000 ,level- 1 )), 1000 ) trinum
  from b connect by level<= 11 ),
d as (
select part, lvl, s, trinum,
  case when trinum= 0  then  0 
       when mod(trinum, 100 ) between  5  and  19  then  5 
       when mod(trinum, 10 ) between  2  and  4  then  2 
       when mod(trinum, 10 )= 1  then  1 
       else  5 
  end power
from c),
nums as (
select  1  num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select  2 , ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select  3 , ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select  4 , ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select  5 , ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select  6 , ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select  7 , ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select  8 , ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select  9 , ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select  1  num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select  2 , ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select  3 , ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select  4 , ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select  5 , ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select  6 , ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select  7 , ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select  8 , ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select  9 , ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select  10 , ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select  11 , ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select  1  num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select  2 , 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select  5 , 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, h.hundr
  || case when t.num= 1  and n.num> 0  then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power, 1 ,p.power1, 2 ,p.power2, 5 ,p.power5)
  || case when d.part= 1  and d.lvl= 0  then
     (select 'ноль' from a where num= 0 ) ||
     (select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
      from b, sfx s
      where s.num(+)=d.power and b.part2_len> 0 )
     end 
  || case when d.part= 2  and d.lvl= 0  then
     (select ' ' ||
       decode(b.part2_len, 1 ,s1.part2_1, 2 ,s1.part2_2,s2.part2_pow||decode(d.power, 1 ,p.power_1, 2 ,p.power_2, 5 ,p.power_2))
      from b, pows p, sfx s1, sfx s2
      where p.num(+)=floor(b.part2_len/ 3 ) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len, 3 ))
     end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/ 100 )
  and t.num(+)=mod(floor(d.trinum/ 10 ), 10 )
  and n.num(+)=mod(d.trinum, 10 )
  and p.num(+)=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn
...
Рейтинг: 0 / 0
23.12.2009, 16:59
    #36382736
soleil_mmc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
Код: plaintext
1.
2.
with
a as (select - 10  num, 'I' sex from dual),

резалт

нониллионов октиллионов септиллионов секстиллионов квинтиллионов квадриллионов триллионов миллиардов миллионов тысяч
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
20.03.2017, 21:39
    #39423619
Бакыт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
0.5
Код: plsql
1.
 пять десятых
...
Рейтинг: 0 / 0
21.03.2017, 09:31
    #39423764
efendi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
Бакыт0.5
Код: plsql
1.
 пять десятых


ага

2.5

Код: plsql
1.
два целых пять десятых
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
22.11.2020, 17:40
    #40021114
Kukharonok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
Скорректировала:
with
a as (select 0.45569784114449877 num, 'M' sex from dual),
b as (select sex, floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)),2)),0) part2, length(substr(to_char(num-floor(num)),2)) part2_len from a),
c as (
select
1 part,
level-1 lvl,
case when level-1=0 then sex when level-1=1 then 'F' else 'M' end s,
mod(floor(part1/power(1000,level-1)),1000) trinum
from b connect by level<=11
union all
select
2 part,
level-1 lvl,
case when level-1=0 then 'F' when level-1=1 then 'F' else 'M' end s,
mod(floor(part2/power(1000,level-1)),1000) trinum
from b connect by level<=11),
d as (
select part, lvl, s, trinum,
case when trinum=0 then 0
when mod(trinum,100) between 5 and 19 then 5
when mod(trinum,10) between 2 and 4 then 2
when mod(trinum,10)=1 then 1
else 5
end power
from c),
nums as (
select 1 num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select 2, ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select 3, ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select 4, ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select 5, ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select 6, ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select 7, ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select 8, ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select 9, ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select 1 num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select 2, ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select 3, ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select 4, ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select 5, ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select 6, ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select 7, ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select 8, ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select 9, ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select 10, ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select 11, ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select 1 num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select 2, 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select 5, 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
e as (
select
row_number() over (order by d.part, d.lvl desc) rn
, CASE WHEN d.part = 1 and d.lvl=0 AND d.trinum = 0 THEN 'ноль целых' END
|| h.hundr
|| case when t.num=1 and n.num>0 then n.teen else t.ten
|| decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end
|| decode(d.power,1,p.power1,2,p.power2,5,p.power5)
|| case when d.part=1 and d.lvl=0 then
(select 'ноль' from a where num=0) ||
(select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
from b, sfx s
where s.num(+)=d.power and b.part2_len>0)
end
|| case when d.part=2 and d.lvl=0 then
(select ' ' ||
decode(b.part2_len,1,s1.part2_1,2,s1.part2_2,s2.part2_pow||decode(d.power,1,p.power_1,2,p.power_2,5,p.power_2))
from b, pows p, sfx s1, sfx s2
where p.num(+)=floor(b.part2_len/3) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len,3))
end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/100)
and t.num(+)=mod(floor(d.trinum/10),10)
and n.num(+)=mod(d.trinum,10)
and p.num(+)=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn

Спасибо за первоначальный селект!
...
Рейтинг: 0 / 0
22.11.2020, 20:11
    #40021147
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
Kukharonok
Скорректировала:
Код: plsql
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.
with
a as (select 0.45569784114449877 num, 'M' sex from dual),
b as (select sex, floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)),2)),0) part2
           , length(substr(to_char(num-floor(num)),2)) part2_len from a),
c as (
  select
   1 part,
   level-1 lvl,
   case when level-1=0 then sex when level-1=1 then 'F' else 'M' end s,
   mod(floor(part1/power(1000,level-1)),1000) trinum
  from b connect by level<=11
  union all
  select
   2 part,
   level-1 lvl,
   case when level-1=0 then 'F' when level-1=1 then 'F' else 'M' end s,
   mod(floor(part2/power(1000,level-1)),1000) trinum
  from b connect by level<=11),
d as (
select part, lvl, s, trinum,
  case when trinum=0 then 0
       when mod(trinum,100) between 5 and 19 then 5
       when mod(trinum,10) between 2 and 4 then 2
       when mod(trinum,10)=1 then 1
       else 5
  end power
from c),
nums as (
select 1 num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select 2, ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select 3, ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select 4, ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select 5, ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select 6, ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select 7, ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select 8, ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select 9, ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select 1 num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select 2, ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select 3, ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select 4, ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select 5, ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select 6, ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select 7, ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select 8, ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select 9, ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select 10, ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select 11, ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select 1 num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select 2, 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select 5, 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, CASE WHEN d.part = 1 and d.lvl=0 AND d.trinum = 0 THEN 'ноль целых' END 
  || h.hundr
  || case when t.num=1 and n.num>0 then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power,1,p.power1,2,p.power2,5,p.power5)
  || case when d.part=1 and d.lvl=0 then
     (select 'ноль' from a where num=0) ||
     (select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
      from b, sfx s
      where s.num(+)=d.power and b.part2_len>0)
     end 
  || case when d.part=2 and d.lvl=0 then
     (select ' ' ||
       decode(b.part2_len,1,s1.part2_1,2,s1.part2_2,s2.part2_pow||decode(d.power,1,p.power_1,2,p.power_2,5,p.power_2))
      from b, pows p, sfx s1, sfx s2
      where p.num(+)=floor(b.part2_len/3) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len,3))
     end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/100)
  and t.num(+)=mod(floor(d.trinum/10),10)
  and n.num(+)=mod(d.trinum,10)
  and p.num(+)=d.lvl)
select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn


Спасибо за первоначальный селект!

Для оформления кода используйте, пожалуйста, тэг SRC.
...
Рейтинг: 0 / 0
24.11.2020, 14:12
    #40021741
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
число прописью
зачем нужна процедура на албанском йезыке?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / число прописью / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]