Это очередное решение популярной задачи печати суммы прописью в бухгалтерских документах. Каждый программист, работающий в этой области, наверняка её решал. Я лет десять назад написал её сначала на Basic-е, а потом перевел и на Clarion.
SummProp( Summ ) Перевод числа в сумму прописью
Summ - Исходное число (REAL). Обрабатываются только положительные числа от нуля до 999 миллиардов. Дробная часть отбрасывается (то есть копейки и центы выделяются и печатаются не в этой функции).
Возвращает строку
Прототип: SummProp( Real ), String
SummProp FUNCTION (Summ)
!============================================
MLR REAL
! Миллиарды
MIL LONG !
Миллионы
TYS LONG !
Тысячи
EDI LONG !
Единицы
FIRST LONG ! Первая
буква строки
Str STRING(250)
SummProp STRING(255) ! Строка для результата
CODE
Summ = abs( Summ )
if Summ < 1
return( 'Ноль ' )
.
! --- Миллиарды ---
SummProp = ''
MLR = int( Summ/1000000000.0)
if MLR > 0 and MLR < 1000
SummProp = I_TO_STR( MLR ) ! Функция
перевода трехзначного числа в строку
if MLR = 1
SummProp = CLIP(SummProp) & ' миллиард '
elsif MLR=2 or MLR=3 or MLR=4
SummProp = CLIP(SummProp) & ' миллиарда '
else
SummProp = CLIP(SummProp) & ' миллиардов '
.
.
! --- Миллионы ---
MIL = int( (Summ - MLR*1000000000) / 1000000.0)
if MIL <> 0
if SummProp<>''
SummProp = clip(SummProp) &' '& I_TO_STR( MIL )
else
SummProp = I_TO_STR( MIL )
.
STR = sub( clip(SummProp), -7, 7 )
if instring( 'один', STR, 1 ) THEN
SummProp = CLIP(SummProp) & ' миллион '
elsif ( instring( 'два', STR, 1 ) or |
instring( 'три', STR, 1 )
or |
instring( 'четыре',
STR, 1 ) )
SummProp = CLIP(SummProp) & ' миллиона '
else
SummProp = CLIP(SummProp) & ' миллионов '
.
.
! --- Тысячи ---
TYS = int( (Summ - MLR*1000000000.0 - MIL*1000000.0)/1000.0 )
if TYS <> 0
if SummProp<>''
SummProp = clip(SummProp) &' '& I_TO_STR( TYS )
else
SummProp = I_TO_STR( TYS )
.
STR = sub( CLIP(SummProp), -7, 7 )
if instring( 'один', STR, 1 )
STR = sub( clip(SummProp), 1, len( clip(SummProp) )-2 )
SummProp = CLIP(STR) & 'на тысяча'
elsif instring( 'два', STR, 1 )
STR = sub( clip(SummProp), 1, len( clip(SummProp) )-1 )
SummProp = clip(STR) & 'е тысячи'
elsif instring( 'три',STR,1 ) or instring( 'четыре',STR,1 )
SummProp = clip(SummProp) & ' тысячи'
else
SummProp = clip(SummProp) & ' тысяч'
.
.
! -- Cотни, десятки и
единицы --
EDI = Summ - MLR*1000000000.0 - MIL*1000000.0 - TYS*1000.0
if SummProp<>''
SummProp = clip(SummProp) &' '& I_TO_STR( EDI )
else
SummProp = I_TO_STR( EDI )
.
! --- Сделать первую букву
заглавной ---
STR = sub( SummProp, 2, len( clip(SummProp) )-1 )
FIRST = val( sub( SummProp, 1, 1 ) )
SummProp = chr( R_UPPER(FIRST) ) & clip(STR) ! Перевод символа в
верхний регистр
return( SummProp )
I_TO_STR FUNCTION (NUM) !
Перевод трехзначного числа в строку пописью
!============================================
HUN LONG !
Сотни
DEC LONG ! Десятки
UNI LONG ! Единицы
SummProp STRING(255)
CODE
HUN = int( NUM/100 ) !
Сотни
DEC = int( (NUM - HUN*100)/10 ) ! Десятки
UNI = NUM - HUN*100 - DEC*10 ! Единицы
! -- Сотни --
if HUN > 0 or HUN < 10
case HUN
of 1 ; SummProp = clip(SummProp) & ' сто'
of 2 ; SummProp = clip(SummProp) & ' двести'
of 3 ; SummProp = CLIP(SummProp) & ' триста'
of 4 ; SummProp = CLIP(SummProp) & ' четыреста'
of 5 ; SummProp = CLIP(SummProp) & ' пятьсот'
of 6 ; SummProp = CLIP(SummProp) & ' шестьсот'
of 7 ; SummProp = CLIP(SummProp) & ' семьсот'
of 8 ; SummProp = CLIP(SummProp) & ' восемьсот'
of 9 ; SummProp = CLIP(SummProp) & ' девятьсот'
.
.
! -- Десятки --
if DEC <> 0
case DEC
of 1
case UNI
of 0 ; SummProp = clip(SummProp) & ' десять'
OF 1 ; SummProp = CLIP(SummProp) & ' одиннадцать'
OF 2 ; SummProp = CLIP(SummProp) & ' двенадцать'
OF 3 ; SummProp = CLIP(SummProp) & ' тринадцать'
OF 4 ; SummProp = CLIP(SummProp) & '
четырнадцать'
OF 5 ; SummProp = CLIP(SummProp) & ' пятнадцать'
OF 6 ; SummProp = CLIP(SummProp) & ' шестнадцать'
OF 7 ; SummProp = CLIP(SummProp) & ' семнадцать'
OF 8 ; SummProp = CLIP(SummProp) & '
восемнадцать'
OF 9 ; SummProp = CLIP(SummProp) & '
девятнадцать'
.
of 2 ; SummProp = clip(SummProp) & ' двадцать'
OF 3 ; SummProp = CLIP(SummProp) & ' тридцать'
OF 4 ; SummProp = CLIP(SummProp) & ' сорок'
OF 5 ; SummProp = CLIP(SummProp) & ' пятьдесят'
OF 6 ; SummProp = CLIP(SummProp) & ' шестьдесят'
OF 7 ; SummProp = CLIP(SummProp) & ' семьдесят'
OF 8 ; SummProp = CLIP(SummProp) & ' восемьдесят'
OF 9 ; SummProp = CLIP(SummProp) & ' девяносто'
.
.
if UNI <> 0 and DEC <> 1
case UNI
of 1 ; SummProp = clip(SummProp) & ' один'
OF 2 ; SummProp = CLIP(SummProp) & ' два'
OF 3 ; SummProp = CLIP(SummProp) & ' три'
OF 4 ; SummProp = CLIP(SummProp) & ' четыре'
OF 5 ; SummProp = CLIP(SummProp) & ' пять'
OF 6 ; SummProp = CLIP(SummProp) & ' шесть'
OF 7 ; SummProp = CLIP(SummProp) & ' семь'
OF 8 ; SummProp = CLIP(SummProp) & ' восемь'
OF 9 ; SummProp = CLIP(SummProp) & ' девять'
.
.
SummProp = left( SummProp )
return( SummProp )
R_UPPER FUNCTION (Ch) !
Перевод символа в верхний регистр
!============================================
CODE
if Ch >= val('а') and Ch <= val('я')
return( Ch-32 )
else
return( val( upper(Ch) ) )
.