Перевтілення StrSum: Clipper

StrSum версія Clipper

Clipper вже історія. Але код можливо, ще десь і працює.

Файл: ADIGITS.PRG

...
 PUBLIC over10
 over10='надцять'
 DECLARE akop[4]
         akop[1]='копiй'
         akop[2]='ка'
         akop[3]='ки'
         akop[4]='ок'
 DECLARE akrb1[5]
         akrb1[1]='грив'
         akrb1[2]='ня'
         akrb1[3]='нi'
         akrb1[4]='ень'
         akrb1[5]=.t.
 DECLARE akrb2[5]
         akrb2[1]='тисяч'
         akrb2[2]='а'
         akrb2[3]='i'
         akrb2[4]=''
         akrb2[5]=.t.
 DECLARE akrb3[5]
         akrb3[1]='мiльйон'
         akrb3[2]=''
         akrb3[3]='и'
         akrb3[4]='iв'
         akrb3[5]=.f.
 DECLARE akrb4[5]
         akrb4[1]='мiльярд'
         akrb4[2]=''
         akrb4[3]='и'
         akrb4[4]='iв'
         akrb4[5]=.f.
 DECLARE akrb5[5]
         akrb5[1]='трильйон'
         akrb5[2]=''
         akrb5[3]='и'
         akrb5[4]='iв'
         akrb5[5]=.f.
 DECLARE adigits1[20]
         adigits1[01]=''
         adigits1[02]='один'
         adigits1[03]='два'
         adigits1[04]='три'
         adigits1[05]='чотири'
         adigits1[06]="п'ять"
         adigits1[07]='шiсть'
         adigits1[08]='сiм'
         adigits1[09]='вiсiм'
         adigits1[10]="дев'ять"
         adigits1[11]='десять'
         adigits1[12]='оди'
         adigits1[13]='два'
         adigits1[14]='три'
         adigits1[15]='чотир'
         adigits1[16]="п'ят"
         adigits1[17]='шiст'
         adigits1[18]='сiм'
         adigits1[19]='вiсiм'
         adigits1[20]="дев'ят"
 DECLARE adigits2[8]
         adigits2[1]='двадцять'
         adigits2[2]='тридцять'
         adigits2[3]='сорок'
         adigits2[4]="п'ятдесят"
         adigits2[5]='шiстдесят'
         adigits2[6]='сiмдесят'
         adigits2[7]='вiсiмдесят'
         adigits2[8]="дев'яносто"
 DECLARE adigits3[10]
         adigits3[01]=''
         adigits3[02]='сто'
         adigits3[03]='двiстi'
         adigits3[04]='триста'
         adigits3[05]='чотириста'
         adigits3[06]="п'ятсот"
         adigits3[07]='шiстсот'
         adigits3[08]='сiмсот'
         adigits3[09]='вiсiмсот'
         adigits3[10]="дев'ятсот"
 DECLARE adigitst[3]
         adigitst[1]=''
         adigitst[2]='одна'
         adigitst[3]='двi'
...

Файл: SUMFRAZA.PRG

* Сума прописом s87
*   Compile: clipper sumkrb.prc /n
*      Link: rtlink fi sumkrb li clipper
*

*
* in: nsum - сума
* out: сума прописом
*

 FUNCTION strsum
 PARAMETERS nsum
 PRIVATE ssum,nkop,skrb,ntriads,ntriad,st,csum
   ssum=ltrim(str(nsum,17,2))
   nkop=val(right(ssum,2))         && видiляю копiйки
   skrb=left(ssum,at('.',ssum)-1)  && видiляю гривнi

   ntriads=int(len(skrb)/3)+;
              if(len(skrb)%3<>0,1,0)      && визначаю кiлькiсть трiад
   ntriad=0
   st=0
   csum=''

    if val(skrb)>0      && nsum>0                   && ї гривнi? (skrb)
      skrb=space(ntriads*3-len(skrb))+skrb     && добавити пробiли неповнiй т.
        for ntriad=ntriads to 1 step -1
           nt=str(ntriad,1)
           st=substr(skrb,(ntriads-ntriad)*3+;
                           if(ntriads-ntriad>0,1,0),3)  && видiляю трiаду
           csum=csum+if(st=='000','',;
                     strtriad(@st,akrb&nt[5])+' '+;
                      akrb&nt[1]+akrb&nt[ind(val(substr(st,2)))]+' ')
        next ntriad
* дописати назву грошовоi одиницi коли остання трiада '000'
        csum=csum+if(st=='000'.and.skrb<>'0',akrb&nt[1]+akrb&nt[ind(val(st))]+' ','')
* дописати копiйки
        csum=csum+if(nkop<10,'0','')+ltrim(str(nkop,2))+' '+;
                     akop[1]+akop[ind(nkop)]
    elseif nkop>0       && ї тўльки копўйки
        st='0'+right(ssum,2)
        csum=strtriad(@st,.t.)+' '+akop[1]+akop[ind(nkop)]
*        csum=csum+if(nkop<10,'0','')+ltrim(str(nkop,2))+' '+;
*                     akop[1]+akop[ind(nkop)]
    endif
    csum=rupper(substr(csum,1,1))+substr(csum,2)
 RETURN csum

*
* in: @st - адрес трiади
*     ltriad - .f. трiада чоловiчого роду, .t. трiада жiночого роду
* out: трiада словами
*
 FUNCTION strtriad
 PARAMETERS st,ltriad
 PRIVATE digit,t,c
    t=val(st)
    c=''
    if t>99
      digit=int(t/100)
      c=adigits3[digit+1]+' '
      t=t%100
    endif
    if t>19
      digit=int(t/10)
      c=c+adigits2[digit-1]+' '
      t=t%10
    endif
    if (ltriad.and.t<3)         && трiада ж. роду
      c=c+adigitst[t+1]
    else
      c=c+adigits1[t+1]+iif(t>10,over10,'')
    endif
 RETURN c

*
* in: n - число                 && i - цiле число<20
* out: iндекс закiнчення
*
 FUNCTION ind
 PARAMETERS n
    i=if(n<20,n,n%10)
 RETURN if(i==1,2,if(i>=2.and.i<=4,3,4))

=-=-=-=-=
Powered by Blogilo

Advertisements

One Response to Перевтілення StrSum: Clipper

  1. Пінгбек: Кілька перевтілень StrSum() « Java це просто

Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: