Функция SummProp 

Это очередное решение популярной задачи печати суммы прописью в бухгалтерских документах.   Каждый программист, работающий в этой области, наверняка её решал.  Я лет десять назад написал её сначала на 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) ) )
  .
  

 

Hosted by uCoz