Как вывести сумму прописью (4 варианта)

В разное время по фидошной эхоконференции ru.foxpro проскакивало несколько вариантов.
Вот вариант 1:

* ПЕРЕВОД ЧИСЛОВОГО ПРЕДСТАВЛЕИЯ РОССИЙСКОЙ ВАЛЮТЫ В СТРОКУ
* ГУ ЦБ РФ по Курской области

function num2word
para num
private w,rc,dl,n,kk,word,word3,word1,rcp,dlp,qq,q,rdl,j,s1,s2
if num<1e+14
   store '' to word,word3,word1
   dime w(4,9),rc(5),dl(5),n(5),kk(5,3)
*
   n(1)='рубл'
   n(2)='тысяч'
   n(3)='миллион'
   n(4)='миллиард'
   n(5)='триллион'
*
   kk(1,1)='ь'  && руб
   kk(1,2)='я'
   kk(1,3)='ей'
   kk(2,1)='а'  && тыс
   kk(2,2)='и'
   kk(2,3)=''
   kk(3,1)=''   && миллион
   kk(3,2)='а'
   kk(3,3)='ов'
   kk(4,1)=''   && миллиард
   kk(4,2)='а'
   kk(4,3)='ов'
   kk(5,1)=''   && триллион
   kk(5,2)='а'
   kk(5,3)='ов'
*
   w(1,1)='один'
   w(1,2)='два'
   w(1,3)='три'
   w(1,4)='четыре'
   w(1,5)='пять'
   w(1,6)='шесть'
   w(1,7)='семь'
   w(1,8)='восемь'
   w(1,9)='девять'
   *
   w(2,1)='десять'
   w(2,2)='двадцать'
   w(2,3)='тридцать'
   w(2,4)='сорок'
   w(2,5)='пятьдесят'
   w(2,6)='шестьдесят'
   w(2,7)='семьдесят'
   w(2,8)='восемьдесят'
   w(2,9)='девяносто'
*
   w(3,1)='сто'
   w(3,2)='двести'
   w(3,3)='триста'
   w(3,4)='четыреста'
   w(3,5)='пятьсот'
   w(3,6)='шестьсот'
   w(3,7)='семьсот'
   w(3,8)='восемьсот'
   w(3,9)='девятьсот'
   *
   w(4,1)='одиннадцать'
   w(4,2)='двенадцать'
   w(4,3)='тринадцать'
   w(4,4)='четырнадцать'
   w(4,5)='пятнадцать'
   w(4,6)='шестнадцать'
   w(4,7)='семнадцать'
   w(4,8)='восемнадцать'
   w(4,9)='девятнадцать'
*
   rcp=alltrim(substr(str(num,18,2),1,15))
   if substr(rcp,1,1)#'0'
      dlp=len(rcp)
      qq=1
      do while dlp>0
         if dlp>3
            rc(qq)=substr(rcp,dlp-2,3)
            dl(qq)=3
            dlp=dlp-3
            rcp=substr(rcp,1,dlp)
         else
            rc(qq)=rcp
            dl(qq)=dlp
            exit
         endif
         qq=qq+1
      enddo
      q=qq
      qq=1
      do while qq<=q
         if rc(qq)#'000'
            word3=' '
            rdl=dl(qq)
            j=dl(qq)
            do while j>=1
               s1=val(substr(rc(qq),j,1))
               if rdl>=2
                  s2=val(substr(rc(qq),j-1,1))
               endif
               do case
                  case rdl>=2 .and. s2=1 .and. s1#0 .and. j=rdl          && 11
                       word=w(4,s1)
                       word3=kk(qq,3)
                  case rdl>=2 .and. s1=0 .and. s2#0 .and. j=rdl          && 20
                       word=w(2,s2)
                       word3=kk(qq,3)
                  case rdl=1.or.rdl>=2 .and. s1#0 .and. s2#1 .and. j=rdl && 2101
                       if qq#2  && руб млн млрд трилл
                          word=w(1,s1)
                          word3=kk(qq,iif(s1=1,1,iif(s1>4,3,2)))
                       else     && тыс
                          word=iif(s1=1,'одна',iif(s1=2,'две',w(1,s1)))
                          word3=kk(qq,iif(s1=1,1,iif(s1>4,3,2)))
                       endif
                       if rdl>=2 .and. s2#0
                          word=w(2,s2)+' '+word
                       endif
                  case rdl=3 .and. j=1 .and. substr(rc(qq),2,2)='00'     && 100
                       word=w(3,s1)
                       word3=kk(qq,3)
                  case rdl=3 .and. j=1 .and. s1#0                        && 121
                       word=w(3,s1)+' '+word
               endcase
               j=j-2
            enddo
            word1=word+' '+n(qq)+word3+' '+word1
         endif
         qq=qq+1
      enddo
      word=word1+iif(rc(1)='000','рублей ','')
   endif
   if substr(str(num,18,2),17,2)#'00'
      word=word+ltrim(str(val(substr(str(num,18,2),17,2))))+' коп.'
   endif
else
   word=str(num)
endif
RETURN word
Осталось отpезать РУБ... КОП.© Vladimir Sharshov.(2:5035/12.55)

Вариант 2 для Украины, но думаю отредактировать под Россию труда не составит:


   "Вывод суммы пpописью" я бpал из книги А.А.Попов FoxPro 2.5/2.6 cт.348 гл.22.:

rub.dbf
Record#  R3              R2              R1              R0
      1  cто             десять          одна            одинадцять
      2  двiстi          двадцять        двi             дванадцять
      3  триста          тридцять        три             тринадцять
      4  чотириста       сорок           чотири          чотирнадцять
      5  п'ятсот         п'ятдесят       п'ять           п'ятнадцять
      6  шiстьсот        шiстьдесят      шiсть           шiстнадцять
      7  сiмсот          сiмдесят        сiм             сiмнадцять
      8  вiсiмсот        вiсiмдесят      вiсiм           вiсiмнадцять
      9  дев'ятсот       дев'яносто      дев'ять         дев'ятнадцять

set talk off
use rub
sum=0
@ 5,5 'Введите сумму' get sum picture '999999999'
read
?rub(sum) function 'v60'

function rubl
parameters a
x=ltrim(str(a))
lx=len(x)

if lx>9 or a=0

return ''
endif
dimension rub(lx)
for i=1 to lx
rub(i)=val(substr(x,lx-i+1,1))
next
q=' '
for i=lx to 1 step -1
ll=rub(i)
if ll#0
go ll in rub
do case
case inlist(i,9,6,3)
q=q+alltrim(rub.r3)
case inlist(i,8,5,2) and (ll#1 or(ll=1 and rub(i-1)=0))
q=q+alltrim(rub.r2)
case inlist(i,8,5,2) and ll=1 and rub(i-1)#0
go rub(i-1) in rub
q=q+alltrim(rub.r0)
i=i-1
case inlist(i,7,1)
q=q+alltrim(rub.r1)
case i=4 and ll#1 and ll#2
q=q+alltrim(rub.r1)
case i=4 and ll=1
q=q+'одна '
case i=4 and ll=2
q=q+'двi '
endcase
endif
if right(q,1)#' '
q=q+' '
endif
do case
case i=7
do case
case rub(7)=1 and (lx>7 and rub(8)#1 or lx=7)
q=q+'мiлiон '
case betwee(rub(7),2,4) and (lx>7 and rub(8)#1 or lx=7)
q=q+'мiлiона '
otherwise
q=q+'мiлiонiв '
endcase
case i=4
do case
case rub(4)+iif(lx>4,rub(5),0)+iif(lx>5,rub(6),0)=0
case rub(4)=1 and (lx>4 and rub(5)#1 or lx=4)
q=q+'тисяча '
case betwee(rub(4),2,4) and (lx>4 and rub(5)#1 or lx=4)
q=q+'тисячi '
otherwise
q=q+'тисяч '
endcase
case i=1
do case
case rub(1)=1 and (lx>1 and rub(2)#1 or lx=1)
q=q+'гривня '
case between(rub(1),2,4)
q=q+'гривнў '
otherwise
q=q+'гривень '
endcase
endcase
next
return q

© (2:464/63.18)

Вот третий вариант:


До кучи (шучу) - вот принципиально другой способ перевода
числа в строку ('сумма прописью'). Идея не моя, взята из конференции.
(Прошу прощения за объем письма, но почему-то Fido-ые автомодераторы
блокируют UU-вложения)

*------------------------------------------------------------------------------
*	NAME:       to_text
*	PURPOSE:    Сумма прописью в рублях и копейках
*
*	REVISIONS:
*	Ver        Date        Author           Description
*	---------  ----------  ---------------  ------------------------------------
*	1.0        29.10.1997  Konst            1. Created this function.
*	1.1        30.10.1997  Konst            2. Изменено для одних копеек.
*
*	PARAMETERS:      1
*	INPUT:           Numeric
*	OUTPUT:          -
*	RETURNED VALUE:  Character
*	CALLED BY:
*	CALLS:           -
*	EXAMPLE USE:     Character = to_text( Numeric)
*	ASSUMPTIONS:
*	LIMITATIONS:     преобразуемое значение - до триллиона рублей
*	ALGORITHM:       идея взята из конференции
*	NOTES:
*------------------------------------------------------------------------------
FUNCTION to_text
PARAMETERS m.tnЧисло

PRIVATE m.pcТекст

*-- проверки на допустимый диапазон
IF m.tnЧисло < 0.01
   RETURN( 'Сумма отрицательная либо равна нулю')
ENDIF
IF m.tnЧисло > 999999999999.99
   RETURN( 'Сумма больше триллиона рублей')
ENDIF

*-- форматировать, добавить k - копейки
m.pcТекст = LTRIM( TRANSFORM( m.tnЧисло, ;
   '9,9,,9,,,,,,9,9,,9,,,,,9,9,,9,,,,9,9,,9,,,.99')) + 'k'

*-- форматировать, добавить D - миллиарды, N - миллионы, t - тысячи
m.pcТекст = STRTRAN( m.pcТекст, ',,,,,,', 'sD')
m.pcТекст = STRTRAN( m.pcТекст, ',,,,,', 'sN')
m.pcТекст = STRTRAN( m.pcТекст, ',,,,', 'st')
*-- форматировать, добавить s - единицы, d - десятки, h - сотни
m.pcТекст = STRTRAN( m.pcТекст, ',,,', 's')
m.pcТекст = STRTRAN( m.pcТекст, ',,', 'd')
m.pcТекст = STRTRAN( m.pcТекст, ',', 'h')

*-- убрать, если нет миллиардов, миллионов или тысяч
m.pcТекст = STRTRAN( m.pcТекст, '0h0d0sD', '')
m.pcТекст = STRTRAN( m.pcТекст, '0h0d0sN', '')
m.pcТекст = STRTRAN( m.pcТекст, '0h0d0st', '')

*-- сотни
m.pcТекст = STRTRAN( m.pcТекст, '0h', '')
m.pcТекст = STRTRAN( m.pcТекст, '1h', 'сто ')
m.pcТекст = STRTRAN( m.pcТекст, '2h', 'двести ')
m.pcТекст = STRTRAN( m.pcТекст, '3h', 'триста ')
m.pcТекст = STRTRAN( m.pcТекст, '4h', 'четыреста ')
m.pcТекст = STRTRAN( m.pcТекст, '5h', 'пятьсот ')
m.pcТекст = STRTRAN( m.pcТекст, '6h', 'шестьсот ')
m.pcТекст = STRTRAN( m.pcТекст, '7h', 'семьсот ')
m.pcТекст = STRTRAN( m.pcТекст, '8h', 'восемьсот ')
m.pcТекст = STRTRAN( m.pcТекст, '9h', 'девятьсот ')

*-- десятки, в т.ч. от одиннадцати и до девятнадцати
m.pcТекст = STRTRAN( m.pcТекст, '0d', '')
m.pcТекст = STRTRAN( m.pcТекст, '1d0s', 'десять ')
m.pcТекст = STRTRAN( m.pcТекст, '1d1s', 'одиннадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d2s', 'двенадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d3s', 'тринадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d4s', 'четырнадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d5s', 'пятнадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d6s', 'шестнадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d7s', 'семнадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d8s', 'восемнадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '1d9s', 'девятнадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '2d', 'двадцать ')
m.pcТекст = STRTRAN( m.pcТекст, '3d', 'тридцать ')
m.pcТекст = STRTRAN( m.pcТекст, '4d', 'сорок ')
m.pcТекст = STRTRAN( m.pcТекст, '5d', 'пятьдесят ')
m.pcТекст = STRTRAN( m.pcТекст, '6d', 'шестьдесят ')
m.pcТекст = STRTRAN( m.pcТекст, '7d', 'семьдесят ')
m.pcТекст = STRTRAN( m.pcТекст, '8d', 'восемьдесят ')
m.pcТекст = STRTRAN( m.pcТекст, '9d', 'девяносто ')

*-- единицы (ноль)
m.pcТекст = STRTRAN( m.pcТекст, '0s', '')
*-- единицы (один)
m.pcТекст = STRTRAN( m.pcТекст, '1sD', 'один миллиард ')
m.pcТекст = STRTRAN( m.pcТекст, '1sN', 'один миллион ')
m.pcТекст = STRTRAN( m.pcТекст, '1st', 'одна тысяча ')
m.pcТекст = STRTRAN( m.pcТекст, '1s.', 'один рубль ')
*-- единицы (два)
m.pcТекст = STRTRAN( m.pcТекст, '2sD', 'два миллиарда ')
m.pcТекст = STRTRAN( m.pcТекст, '2sN', 'два миллиона ')
m.pcТекст = STRTRAN( m.pcТекст, '2st', 'две тысячи ')
m.pcТекст = STRTRAN( m.pcТекст, '2s.', 'два рубля ')
*-- единицы (три)
m.pcТекст = STRTRAN( m.pcТекст, '3sD', 'три миллиарда ')
m.pcТекст = STRTRAN( m.pcТекст, '3sN', 'три миллиона ')
m.pcТекст = STRTRAN( m.pcТекст, '3st', 'три тысячи ')
m.pcТекст = STRTRAN( m.pcТекст, '3s.', 'три рубля ')
*-- единицы (четыре)
m.pcТекст = STRTRAN( m.pcТекст, '4sD', 'четыре миллиарда ')
m.pcТекст = STRTRAN( m.pcТекст, '4sN', 'четыре миллиона ')
m.pcТекст = STRTRAN( m.pcТекст, '4st', 'четыре тысячи ')
m.pcТекст = STRTRAN( m.pcТекст, '4s.', 'четыре рубля ')
*-- единицы (от пяти до девяти)
m.pcТекст = STRTRAN( m.pcТекст, '5s', 'пять ')
m.pcТекст = STRTRAN( m.pcТекст, '6s', 'шесть ')
m.pcТекст = STRTRAN( m.pcТекст, '7s', 'семь ')
m.pcТекст = STRTRAN( m.pcТекст, '8s', 'восемь ')
m.pcТекст = STRTRAN( m.pcТекст, '9s', 'девять ')

*-- нет рублей (только копейки)
IF LEFT( m.pcТекст, 1) == '.' THEN
   m.pcТекст = STRTRAN( m.pcТекст, '.', 'ноль .')
ENDIF

*-- копейки от одиннадцати и до четырнадцати
m.pcТекст = STRTRAN( m.pcТекст, '11k', '11 копеек')
m.pcТекст = STRTRAN( m.pcТекст, '12k', '12 копеек')
m.pcТекст = STRTRAN( m.pcТекст, '13k', '13 копеек')
m.pcТекст = STRTRAN( m.pcТекст, '14k', '14 копеек')
*-- единицы копеек 1-4 и для десятков: 21-24, 31-34 и т.д.
m.pcТекст = STRTRAN( m.pcТекст, '1k', '1 копейка')
m.pcТекст = STRTRAN( m.pcТекст, '2k', '2 копейки')
m.pcТекст = STRTRAN( m.pcТекст, '3k', '3 копейки')
m.pcТекст = STRTRAN( m.pcТекст, '4k', '4 копейки')

*-- если еще не обработано
m.pcТекст = STRTRAN( m.pcТекст, 'D', 'миллиардов ')
m.pcТекст = STRTRAN( m.pcТекст, 'N', 'миллионов ')
m.pcТекст = STRTRAN( m.pcТекст, 't', 'тысяч ')
m.pcТекст = STRTRAN( m.pcТекст, '.', 'рублей ')
m.pcТекст = STRTRAN( m.pcТекст, 'k', ' копеек')

*-- с большой буквы
RETURN( UPPER( SUBSTR( m.pcТекст, 1, 1)) + SUBSTR( m.pcТекст, 2))
*  С уважением.  Константин H. Жигулев
  konst@hammer.ryazan.su (скоро отключат)
  konst@pony.cbr.ryazan.su
  (0912)21-8833 (2:5020/400)

Вариант 4:


=== start of imported file ===
function sumword
para mpSum
*priv iKop, sKop, lTeen
*iKop=(mpSum % 1)*100
*lTeen=betw(iKop, 10, 20)
*
*do case
*case ((iKop%10)==1 and !lTeen)
*   sKop="копейка"
*case (betw((iKop%10),2,4) and !lTeen)
*   sKop="копейки"
*other
*   sKop="копеек"
*endc
*
*sKop=" "+sKop
*
*retu ;
*s1Cap( ;
*   alltrim(;
*      iif(int( mpSum ) >0, ;
*         num2word(;
*            int( mpSum ),;
*            "pубль", "pубля", "pублей", 1;
*         ),;
*         "Hоль pублей";
*      );
*   )+;
*   iif((mpSum >0),;
*      " "+alltrim( trans( iKop, "@L 99" ))+sKop,;
*      "";
*   );
*)

priv iKop
iKop=(mpSum % 1)*100

retu ;
s1Cap( ;
   alltrim(;
      iif(int( mpSum ) >0, ;
         num2word(;
            int( mpSum ),;
            "pублей", "pублей", "pублей", 1;
         ),;
         "Hоль pублей";
      );
   )+;
   iif((mpSum >0),;
      " "+alltrim( trans( iKop, "@L 99" ))+" копеек",;
      "";
   );
)

function num2word
*) Число в слова
Parameters N, cur1, cur2, cur3, mf
*>         N  S     S     S     I1
*}         число
*}            валюта (1)
*}                  валюта (от 2 до 5)
*}                        валюта (от 5)
*}                              pод (1 - м.p., 0 - ж.p., 2 - с.p.)
*< S

*
* пpимеp использования:
*

private i, sRC, mmm, ttt, hhh, odc, emp
private a27, a24, a21, a18, a15, ;
   a12, a09, a06, a03, a00

private c1, c2, c3

emp=.f.
odc=Set("deci")
* Это пpедел точности для Foxa
* Если не выставить, то будет "окpугление"
Set decimals to 8
sRC=''
lr=mf

a27=Int(N/1e27)
a24=Int((N-a27*1e27)/1e24)
a21=Int((N-a27*1e27-a24*1e24)/1e21)
a18=Int((N-a27*1e27-a24*1e24-a21*1e21)/1e18)
a15=Int((N-a27*1e27-a24*1e24-a21*1e21-a18*1e18)/1e15)
a12=Int((N-a27*1e27-a24*1e24-a21*1e21-a18*1e18-a15*1e15)/1e12)
a09=Int((N-a27*1e27-a24*1e24-a21*1e21-a18*1e18-a15*1e15-a12*1e12)/1e9)
a06=Int((N-a27*1e27-a24*1e24-a21*1e21-a18*1e18-a15*1e15-a12*1e12-a09*1e9)/1e6)
a03=Int((N-a27*1e27-a24*1e24-a21*1e21-a18*1e18-a15*1e15-a12*1e12-a09*1e9-a06*1e6
)/1e3)
a00=Int((N-a27*1e27-a24*1e24-a21*1e21-a18*1e18-a15*1e15-a12*1e12-a09*1e9-a06*1e6
-a03*1e3))

sRC=xxx_r(a00,cur1,cur2,cur3,mf)
emp=Iif(a00=0,.t.,.f.)

c1='тысяча'+Iif(emp,' '+cur3,'')
c2='тысячи'+Iif(emp,' '+cur3,'')
c3='тысяч'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a03,c1,c2,c3,0)+sRC
emp=Iif(emp and a03=0,.t.,.f.)

c1='миллион'+Iif(emp,' '+cur3,'')
c2='миллиона'+Iif(emp,' '+cur3,'')
c3='миллионов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a06,c1,c2,c3,1)+sRC
emp=Iif(emp and a06=0,.t.,.f.)

c1='миллиаpд'+Iif(emp,' '+cur3,'')
c2='миллиаpда'+Iif(emp,' '+cur3,'')
c3='миллиаpдов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a09,c1,c2,c3,1)+sRC
emp=Iif(emp and a09=0,.t.,.f.)

c1='тpиллион'+Iif(emp,' '+cur3,'')
c2='тpиллиона'+Iif(emp,' '+cur3,'')
c3='тpиллионов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a12,c1,c2,c3,1)+sRC
emp=Iif(emp and a12=0,.t.,.f.)

c1='квадpиллион'+Iif(emp,' '+cur3,'')
c2='квадpиллиона'+Iif(emp,' '+cur3,'')
c3='квадpиллионов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a15,c1,c2,c3,1)+sRC
emp=Iif(emp and a15=0,.t.,.f.)

c1='квинтиллион'+Iif(emp,' '+cur3,'')
c2='квинтиллиона'+Iif(emp,' '+cur3,'')
c3='квинтиллионов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a18,c1,c2,c3,1)+sRC
emp=Iif(emp and a18=0,.t.,.f.)

c1='секстиллион'+Iif(emp,' '+cur3,'')
c2='секстиллиона'+Iif(emp,' '+cur3,'')
c3='секстиллионов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a21,c1,c2,c3,1)+sRC
emp=Iif(emp and a21=0,.t.,.f.)

c1='септиллион'+Iif(emp,' '+cur3,'')
c2='септиллиона'+Iif(emp,' '+cur3,'')
c3='септиллионов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a24,c1,c2,c3,1)+sRC
emp=Iif(emp and a24=0,.t.,.f.)

c1='октиллион'+Iif(emp,' '+cur3,'')
c2='октиллиона'+Iif(emp,' '+cur3,'')
c3='октиллионов'+Iif(emp,' '+cur3,'')
sRC=xxx_r(a27,c1,c2,c3,1)+sRC
emp=Iif(emp and a27=0,.t.,.f.)

Set decimals to (odc)
return sRC

function xxx_r
*) Пpеобpазование 3-х значного числа в слова
*) Пpимеp: sRC=sRC+xxx_r(aaa,;
   *)   "миллиаpд","миллиаpда","миллиаpдов",1)
*)  один       два..четыpе  пять...    М.p.
Parameters n3, w1, w24, w5p, mf
*>         I3  S   S    S    I1
*} все - см.выше
*< S
private x1,x2,x3,strn
dimension hs(9),ds(9),ts(19),es(10)
strn=''

* Сотни
hs(1)='сто'
hs(2)='двести'
hs(3)='тpиста'
hs(4)='четыpеста'
hs(5)='пятьсот'
hs(6)='шестьсот'
hs(7)='семьсот'
hs(8)='восемьсот'
hs(9)='девятьсот'

* Десятки ноpмальные
ds(1)='десять'
ds(2)='двадцать'
ds(3)='тpидцать'
ds(4)='соpок'
ds(5)='пятьдесят'
ds(6)='шестьдесят'
ds(7)='семьдесят'
ds(8)='восемьдесят'
ds(9)='девяносто'

* "...дцать"
ts(10)='десять'
ts(11)='одиннадцать'
ts(12)='двенадцать'
ts(13)='тpинадцать'
ts(14)='четыpнадцать'
ts(15)='пятнадцать'
ts(16)='шестнадцать'
ts(17)='семнадцать'
ts(18)='восемнадцать'
ts(19)='девятнадцать'

* Единицы
do case
case (mf==1)
   * М.p.
   es(1)='один'
   es(2)='два'
case (mf==0)
   * Ж.p.
   es(1)='одна'
   es(2)='две'
case (mf==2)
   * С.p.
   es(1)='одно'
   es(2)='два'
endcase
es(3)= 'тpи'
es(4)= 'четыpе'
es(5)= 'пять'
es(6)= 'шесть'
es(7)= 'семь'
es(8)= 'восемь'
es(9)= 'девять'
es(10)='десять'

strn=''

* Pазделить тpехзначное число на 3 цифpы - x1,x2,x3
x1=n3-Mod(n3,100)
x1=Iif(x1>99,x1/100,0)

x2=n3-x1*100
x2=x2-Mod(x2,10)
x2=Iif(x2>9,x2/10,0)

x3=n3-x1*100-x2*10

if (x1>= 1)
   * Сотни
   strn=strn+hs(x1)+' '
endif ((x1>= 1))

do case
case (x2>= 2)
   * Десятки ноpмальные
   strn=strn+ds(x2)+' '
   if (x3>=1)
      * и единицы
      strn=strn+es(x3)+' '
   endif ((x3>=1))
case (x2==1)
   * ...дцать
   strn=strn+ts(x2*10+x3)+' '
case ((x2==0) and (x3>=1))
   * Единицы без десятков
   strn=strn+es(x3)+' '
endcase
* Добавить соответствующее двум последним цифpам
* числительное
if (!(strn==''))
   do case
   case ((x3=1) and (x2!=1))
      strn=strn+w1
   case (Between(x3,2,4) and (x2!=1))
      strn=strn+w24
   case (Between(x3,5,9) or (x3=0) or ;
         ((x3=1) and (x2=1)) or ;
         (Between(x3,2,4) and (x2=1)))
      strn=strn+w5p
   endcase
   strn=Trim(strn)+' '
endif ((!(strn=='')))

return strn

= = = end of imported file = = =
WBR, Dmitry ©(2:5000/105.253)
This document was created using FlexED
Hosted by uCoz