Как записать число прописью?

NU
Дата: 29.09.2004 13:25:58
Есть некое число. Например, 83. Надо, чтобы в результате запроса возвращалось "восемьдесят три". Есть ли какой -то способ сделать это?
igor2222
Дата: 29.09.2004 13:33:54
Хвункцию рисовать. 15 минут мучений и много много удовольствия
Vadim_Maximov
Дата: 29.09.2004 13:35:05
Еще можно поиском воспользоваться. Иногда помогает. :)
Например здесь...
Viewer
Дата: 29.09.2004 13:52:50
Посмотрите аттач, может пригодится (сам не пробовал, не было необходимости) :0)
NU
Дата: 29.09.2004 14:01:57
Спасибо всем.
vecna
Дата: 29.09.2004 14:34:57
видел где-то здесь не так давно:

select to_char(to_date(1265413,'J'),'JSP') from dual;

красотища! =)
over
Дата: 29.09.2004 16:36:06
create or replace function NUM2TEXT(value in number)
return varchar2
as
RESULT    varchar2(255);
bn        number;
sm        number;
TRs       integer;
MRs       integer;
MLs       integer;
Ts        integer;
Rs        integer;
Cs        integer;
sHundred  varchar2(255) := 'сто;двести;триста;четыреста;пятьсот;шестьсот;семьсот;восемьсот;девятьсот';
sDecimal  varchar2(255) := 'десять;двадцать;тридцать;сорок;пятьдесят;шестьдесят;семьдесят;восемьдесят;девяносто';
sDecUnit  varchar2(255) := 'одиннадцать;двенадцать;тринадцать;четырнадцать;пятнадцать;шестнадцать;семнадцать;восемнадцать;девятнадцать';
sUnitM    varchar2(255) := 'один;два;три;четыре;пять;шесть;семь;восемь;девять';
sUnitF    varchar2(255) := 'одна;две;три;четыре;пять;шесть;семь;восемь;девять';
sTrillion varchar2(255) := 'триллион;триллиона;триллионов';
sBillion  varchar2(255) := 'миллиард;миллиарда;миллиардов';
sMillion  varchar2(255) := 'миллион;миллиона;миллионов';
sThousand varchar2(255) := 'тысяча;тысячи;тысяч';
sNull     varchar2(255) := 'ноль';
function SumNumWord( value integer, fSex boolean, sCategory  varchar2,
MoreThanThousand  boolean ) return varchar2
as
RESULT    varchar2(255);
v1  integer;
v2  integer;
v3  integer;
n   integer;
lsH  varchar2(255);
lsD  varchar2(255);
lsDU varchar2(255);
lsU  varchar2(255);
nCategory  integer;
begin
Result := '';
if value<1 then
return (Result);
end if;
lsH  := sHundred;
lsD  := sDecimal;
lsDU := sDecUnit;
if fSex then
lsU := sUnitM;
else
lsU := sUnitF;
end if;
n  := value;
v1 := FLOOR(n / 100);
n  := n - v1*100;
v2 := FLOOR(n / 10);
v3 := n - v2*10;
nCategory := 3;
if v1 > 0 then
Result := Result || STRTOK(lsH,';',v1) || ' ';
end if;
if (v2 = 1) and (v3<>0) then
Result := Result || STRTOK(lsDU,';',v3) || ' ';
else
if v2 > 0 then
Result := Result || STRTOK(lsD,';',v2) || ' ';
end if;
if v3 > 0 then
Result := Result || STRTOK(lsU,';',v3) || ' ';
end if;
if v3 > 4 or v3 = 0 then
nCategory := 3;
else
if v3 = 1 then
nCategory := 1;
else
nCategory := 2;
end if;
end if;
end if;
if sCategory is not null then
Result := Result || STRTOK(sCategory,';',nCategory) || ' ';
end if;
return (Result);
end;
begin
Result := '****';
if (Value<0.0) or (Value>=1000000000000000.0) then
return (Result);
end if;
Result := '';
--// выделить значения по каждому порядку
sm  := Value;
bn  := sm/1000000000000.0;
TRs := Floor(bn);
sm  := sm - TRs*1000000000000.0;
--///
bn  := sm/1000000000.0;
MRs := Floor(bn);
sm  := sm - MRs*1000000000.0;
--///
bn  := sm/1000000.0;
MLs := Floor(bn);
sm  := sm - MLs*1000000.0;
--///
bn  := sm/1000.0;
Ts  := Floor(bn);
sm  := sm - Ts*1000.0;
--///
Rs  := Floor(sm);
sm  := sm - Rs;
bn  := sm*100.0+0.01;
Cs  := Floor(bn);
if TRs > 0 then
Result := Result || SumNumWord(TRs,True,sTrillion, true);
end if;
if MRs > 0 then
Result := Result || SumNumWord(MRs,True,sBillion, true);
end if;
if MLs > 0 then
Result := Result || SumNumWord(MLs,True,sMillion, true);
end if;
if Ts > 0 then
Result := Result || SumNumWord(Ts,false,sThousand, true);
end if;
if (TRs=0) and (MRs=0) and (MLs=0) and (Ts=0) and (Rs=0) then
null;
else
Result := Result || SumNumWord(Rs,true,null, false);
end if;
return (RESULT);
end;