Мiльон гривень. Готiвкою



Posted by Анатолий Анимица (195.58.229.52) on November 25, 2001 at 00:34:20:

Сумма прописью на украинском, оказывается, не вполне тривиальная задача. Функция [wn] на украинских серверах ФБП сама собой, но иногда под рукой нет "украинского" сервера, да и UltraH-32 по украински - это тоже вещь не на каждой машине существующая. Была еще такая Zabylkakzovut.exe с выводом строки суммы прописью, но она же неудобна - поэтому мне пришлось написать маленькую подпрограммку WNUA, которая вход S (число) преобразует в выход b (строка представления числа прописью).
Ее удобно воткнуть куда-нибудь в first.rpt среди других подпрограмм и заменять мотом функции [wn] в своих приложениях на S=...;call wnua. Для простоты я пока не стал выкладывать текст в файл на сайте - просто возьмите его прямо из этого сообщения через clipboard (select-copy-paste)


:wnua подпрограмма формирования суммы прописью вход S выход B для UA
if s>2000000000 b='шалена купа грошей - звернiться до програмиста';return;endif
e1='одтчпшсв';e2='ОДТЧПШСВ' константы заглавной буквы числа прописью
[a 1,'один','два','три','чотири','п'+[ch 39]+'ять','шiсть','сiм','вiсiм','дев'+[ch 39]+'ять','десять','одинадцять','дванадцять','тринадцять','чотирнадцять','п'+[ch 39]+'ятнадцять','шiстнадцять','сiмнадцять','вIсIмнадцять','дев'+[ch 39]+'ятнадцять']
[b 1,'двадцять','тридцять','сорок','п'+[ch 39]+'ятдесят','шiстдесят','сiмдесят','вiсiмдесят','дев'+[ch 39]+'яносто']
[c 1,'сто','двiстi','триста','чотириста','п'+[ch 39]+'ятсот','шiстсот','сiмсот','вiсiмсот','дев'+[ch 39]+'ятсот']
b=' ' заглушка число прописью
p1=' ';p2=' ';p3=' ' заглушки триад числа прописью
tr=[tr S];ce=[ce S]; гривнi й копiйки
t1=0;t2=0;t3=0 триады миллионы тысячи единицы
if tr>=1000000 t1=[tr tr/1000000];t2=tr-t1*1000000;else t2=tr;t1=0;endif
if t2>=1000 t3=t2;t2=[tr t2/1000];t3=t3-t2*1000;else t3=t2;t2=0;endif
if t1 tp=[intsn t1];tr=[cp [intsn 1000+t1],2,3];tc=[cp tr,3,1];call uatriada;b=[strip b+' '+tp]
if tc='1' b=b+' мiльон';elseif [ps tc,'234'] b=b+' мiльони';else b=b+' мiльонiв';endif
endif
if t2 tp=[intsn t2];tr=[cp [intsn 1000+t2],2,3];tc=[cp tr,3,1];call uatriada;b=[strip b+' '+tp]
if tc='1' b=b+' тисяча';elseif [ps tc,'234'] b=b+' тисячi';else b=b+' тисяч';endif
endif
if t3 tp=[intsn t3];call uatriada;b=[strip [strip b]+' '+tp];endif
b=[strip b]+' грн. '+[cp [intsn 100+ce],2,2]+' коп.'
ps=[ps [cp b,1,1],e1];b=[strip [cp e2,ps,1]]+[strip [cp b,2,200]]
return wnua
:uatriada вход tp число строкой 1..999 три цифры выход число прописью tp
to=' '
if [length tp]=3 to=[strip to+' '+[c [vl [cp tp,1,1]]]];tp=[cp tp,2,2];endif
if [length tp]=2
cp=[cp tp,1,1];if cp='0' to=[strip to+' '+[a [vl [cp tp,2,1]]]];tp=to;return;endif;if [ps cp,'23456789']
to=[strip to+' '+[b [vl cp]-1]];te=[cp tp,2,1];if [ps te,'123456789'] to=[strip to+' '+[a [vl te]]];endif
elseif [ps tp,'00|10|11|12|13|14|15|16|17|18|19'] to=[strip to+' '+[b [vl tp]]]
else to=to+' '+[b [vl [cp tp,2,1]]]
endif
else to=to+' '+[a [vl tp]]+' '
endif
tp=[strip to]
return

Для желающих - тестик этой подпрограммы _tstwnua.rpt:


Тест WNUA pi .. pi^18
i=3.141592665;j=i
for k=1 to 18
s=i
call wnua
^^^^^^^^^^s^^ ^^^^^^t1 ^^t2 ^^t3 ^ce ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^b
i=i*j
endfor
stop


И, наконец, как оно тестирует:


3.14 0 0 3 14 Три грн. 14 коп.
9.87 0 0 9 87 Дев'ять грн. 87 коп.
31.01 0 0 31 1 Тридцять один грн. 01 коп.
97.41 0 0 97 41 Дев'яносто сiм грн. 41 коп.
306.02 0 0 306 2 Триста шiсть грн. 02 коп.
961.39 0 0 961 39 Дев'ятсот шiстдесят один грн. 39 коп.
3020.29 0 3 20 29 Три тисячi двадцять грн. 29 коп.
9488.53 0 9 488 53 Дев'ять тисяч чотириста вiсiмдесят вiсiм грн. 53 коп.
29809.10 0 29 809 10 Двадцять дев'ять тисяч вiсiмсот дев'ять грн. 10 коп.
93648.05 0 93 648 5 Дев'яносто три тисячi шiстсот сорок вiсiм грн. 05 коп.
294204.03 0 294 204 3 Двiстi дев'яносто чотири тисячi двiстi чотири грн. 03 коп.
924269.22 0 924 269 22 Дев'ятсот двадцять чотири тисячi двiстi шiстдесят дев'ять грн. 22 коп.
2903677.41 2 903 677 41 Два мiльони дев'ятсот три тисячi шiстсот сiмдесят сiм грн. 41 коп.
9122171.65 9 122 171 65 Дев'ять мiльонiв сто двадцять два тисячi сто сiмдесят один грн. 65 коп.
28658147.53 28 658 147 53 Двадцять вiсiм мiльонiв шiстсот п'ятдесят вiсiм тисяч сто сорок сiм грн. 53 коп.
90032226.07 90 32 226 7 Дев'яносто мiльонiв тридцять два тисячi двiстi двадцять шiсть грн. 07 коп.
282844581.05 282 844 581 5 Двiстi вiсiмдесят два мiльони вiсiмсот сорок чотири тисячi п'ятсот вiсiмдесят один грн. 05 коп.
888582461.16 888 582 461 16 Вiсiмсот вiсiмдесят вiсiм мiльонiв п'ятсот вiсiмдесят два тисячi чотириста шiстдесят один грн. 16

Недостатки: Надо или законодательно изменить название валюты "еривня" на "гривень", или добавить пару строк к программе с заменами "один" на "одна" и "два" на "двi".

Но это уже на самостоятельную разработку задание.

Желающие могут написать красивше. Если сумеют.
Тем более, у нас где-то в документации - вспомнил я - такой текст на паскале есть руки А.Г.Водяника.


С уважением

ААА



Пpишедшие ответы: