Денежная сумма прописью. Довольно короткий вариант.

Сумма прописью. Придумал этот алгоритм после мучений с книжным примером.
[cce_visualfoxpro]

************************************************************************************************
* СУММА ПРОПИСЬЮ Visual FoxPro
*
* Принимает число от 0 до 999'999'999'999,99
* Возвращает текстовую строку с суммой в рублях
*
* Если число отрицательное, то берет модуль числа.
* По желании не сложно доработать, чтобы второй параметр указывал тип валюты,
* и вместо "рублей" и "копеек" подставлять соответствующие слова.
*
* Оптимизация по скорости для многократного вызова в цикле не проводилась.
************************************************************************************************

FUNCTION Sum_Str
PARAMETERS nSum
LOCAL cRet,AswCounter,AswS,Asw,Asw1

cRet=""
nSum=iif(empty(nSum),0,abs(nSum))

AswS=str(nSum,15,2)
FOR AswCounter=1 to 10 STEP 3
Asw=substr(AswS,AswCounter,3)
if Asw#space(3)
Asw1=""
do case
case substr(Asw,1,1)="1"
Asw1="сто "
case substr(Asw,1,1)="2"
Asw1="двести "
case substr(Asw,1,1)="3"
Asw1="триста "
case substr(Asw,1,1)="4"
Asw1="четыреста "
case substr(Asw,1,1)="5"
Asw1="пятьсот "
case substr(Asw,1,1)="6"
Asw1="шестьсот "
case substr(Asw,1,1)="7"
Asw1="семьсот "
case substr(Asw,1,1)="8"
Asw1="восемьсот "
case substr(Asw,1,1)="9"
Asw1="девятьсот "
endcase
cRet=cRet+Asw1
Asw1=""
if substr(Asw,2,1)="1"
do case
case substr(Asw,3,1)="0"
Asw1="десять "
case substr(Asw,3,1)="1"
Asw1="одиннадцать "
case substr(Asw,3,1)="2"
Asw1="двенадцать "
case substr(Asw,3,1)="3"
Asw1="тринадцать "
case substr(Asw,3,1)="4"
Asw1="четырнадцать "
case substr(Asw,3,1)="5"
Asw1="пятнадцать "
case substr(Asw,3,1)="6"
Asw1="шестнадцать "
case substr(Asw,3,1)="7"
Asw1="семнадцать "
case substr(Asw,3,1)="8"
Asw1="восемнадцать "
case substr(Asw,3,1)="9"
Asw1="девятнадцать "
endcase
cRet=cRet+Asw1
do case
case AswCounter=1
cRet=cRet+"миллиардов "
case AswCounter=4
cRet=cRet+"миллионов "
case AswCounter=7
cRet=cRet+"тысяч "
case AswCounter=10
cRet=cRet+"рублей "
endcase
else
do case
case substr(Asw,2,1)="2"
Asw1="двадцать "
case substr(Asw,2,1)="3"
Asw1="тридцать "
case substr(Asw,2,1)="4"
Asw1="сорок "
case substr(Asw,2,1)="5"
Asw1="пятьдесят "
case substr(Asw,2,1)="6"
Asw1="шестьдесят "
case substr(Asw,2,1)="7"
Asw1="семьдесят "
case substr(Asw,2,1)="8"
Asw1="восемьдесят "
case substr(Asw,2,1)="9"
Asw1="девяносто "
endcase
cRet=cRet+Asw1
Asw1=""
do case
case substr(Asw,1,3)="000"
Asw1=iif(AswCounter=10,"рублей ","")
case substr(Asw,3,1)="0" .and. substr(Asw,1,3)#"000"
Asw1=iif(AswCounter=7,"тысяч ", ;
iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))
case substr(Asw,3,1)="1"
Asw1=iif(AswCounter=7,"одна тысяча ", ;
"один "+iif(AswCounter=1,"миллиард ",iif(AswCounter=4,"миллион ","рубль ")))
case substr(Asw,3,1)="2"
Asw1=iif(AswCounter=7,"две тысячи ", ;
"два "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))
case substr(Asw,3,1)="3"
Asw1=iif(AswCounter=7,"три тысячи ", ;
"три "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))
case substr(Asw,3,1)="4"
Asw1=iif(AswCounter=7,"четыре тысячи ", ;
"четыре "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))
case substr(Asw,3,1)="5"
Asw1=iif(AswCounter=7,"пять тысяч ", ;
"пять "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))
case substr(Asw,3,1)="6"
Asw1=iif(AswCounter=7,"шесть тысяч ", ;
"шесть "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))
case substr(Asw,3,1)="7"
Asw1=iif(AswCounter=7,"семь тысяч ", ;
"семь "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))
case substr(Asw,3,1)="8"
Asw1=iif(AswCounter=7,"восемь тысяч ", ;
"восемь "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))
case substr(Asw,3,1)="9"
Asw1=iif(AswCounter=7,"девять тысяч ", ;
"девять "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))
endcase
cRet=cRet+Asw1
endif
endif
ENDFOR
AswS=substr(AswS,14,2)

if substr(AswS,1,1)="1" .or. substr(AswS,2,1)="0"
cRet=cRet+AswS+" копеек"
else
do case
case substr(AswS,2,1)>"4"
cRet=cRet+AswS+" копеек"
case substr(AswS,2,1)="1"
cRet=cRet+AswS+" копейка"
case substr(AswS,2,1)>"1" .and. substr(AswS,2,1)<"5" cRet=cRet+AswS+" копейки" endcase endif cRet=upper(substr(cRet,1,1))+substr(cRet,2) if nSum<1 cRet="Ноль "+cRet endif return cRet [/cce_visualfoxpro]

Автор: Asws
0

Автор публикации

не в сети 16 лет

Asws

0
Комментарии: 0Публикации: 2Регистрация: 20-01-2008
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 1,26 КБ 618sum_str
Оставить комментарий
Авторизация
*
*
Генерация пароля