|
* ПЕРЕВОД ЧИСЛОВОГО ПРЕДСТАВЛЕИЯ РОССИЙСКОЙ ВАЛЮТЫ В СТРОКУ * ГУ ЦБ РФ по Курской области 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)