轉換英文貨幣大小寫的代碼

ABAP開發中遇到要用到英文貨幣大小寫的轉化問題,搜索了一下,沒有,只好自己來做。

FUNCTION ZTRANSFORMNUM.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(NUM) TYPE  VBRK-NETWR
*"  EXPORTING
*"     REFERENCE(NUMSTR) TYPE  STRING
*"----------------------------------------------------------------------

  DATA: numqb TYPE string,
        numzs TYPE string,
        numxs TYPE string,
        numxsstr TYPE string,"小數部分對應的英文大寫
        numtemps TYPE string,
        numtempc(1) TYPE C.
  DATA numtab TYPE TABLE OF string WITH HEADER LINE.
  DATA: numlen TYPE i,
        colno TYPE i VALUE 0,
        recordno TYPE i,
        numdiv TYPE i,"以3除整個整數部分得到份數
        nummod TYPE i."以3除整個整數部分得到餘數
  DATA splitsign(1) TYPE C VALUE '.'.

*  定義內表用於存放分開的數字和對應的英文大寫
  DATA: BEGIN OF t_numstr OCCURS 0,
        colno TYPE I,"序號
        num TYPE STRING,"數字
        behnum TYPE STRING,"數字後面的英文信息,如Million,Thousand等
        sumnum TYPE STRING,"合成英文信息
        END OF t_numstr.

  numqb = num.
  SPLIT numqb AT splitsign INTO TABLE numtab.

*先把整個數字區分爲整數和小數部分。
  DATA: lc TYPE i VALUE 0.
  LOOP AT numtab.
    lc = lc + 1.
    IF lc = 1.
      numzs = numtab.
    ELSE.
      numxs = numtab.
    ENDIF.
  ENDLOOP.

*把整數部門分成3個數字一組的內表
  DATA sep(1) TYPE c VALUE ','.
  IF numzs NE '0'.
    numlen = strlen( numzs ).
    nummod = numlen MOD 3.
    numdiv = numlen DIV 3.
    IF nummod NE 0.
      numtemps = numzs.
      SHIFT numzs BY nummod PLACES CIRCULAR.
      CONCATENATE numzs ',' INTO numzs.
*    ELSE.
    ENDIF.

    DO numdiv TIMES.
      SHIFT numzs BY 3 PLACES CIRCULAR.
      CONCATENATE numzs ',' INTO numzs.
    ENDDO.

    CLEAR numtab.
    SPLIT numzs AT sep INTO TABLE numtab.
*end把整數部門分成3個數字一組的內表

*獲得內表記錄數
    DESCRIBE TABLE numtab LINES recordno.

*填充分開的數字和對應的英文大寫的內表
    LOOP AT numtab.
      t_numstr-colno = recordno - colno.
      t_numstr-num = numtab.
      CASE t_numstr-colno.
        WHEN 1.
          t_numstr-behnum = ''.
        WHEN 2.
          t_numstr-behnum = 'THOUSAND'.
        WHEN 3.
          t_numstr-behnum = 'MILLION'.
        WHEN 4.
          t_numstr-behnum = 'BILLION'.
      ENDCASE.

      PERFORM TRANSBW USING t_numstr-num CHANGING t_numstr-sumnum.

      IF t_numstr-behnum NE ''.
        CONCATENATE t_numstr-sumnum t_numstr-behnum INTO t_numstr-sumnum SEPARATED BY SPACE.
      ENDIF.

      t_numstr-colno = colno + 1.
      APPEND t_numstr TO t_numstr[].
      colno = colno + 1.
    ENDLOOP.
  ENDIF.

  LOOP AT t_numstr.
    CONCATENATE numstr t_numstr-sumnum INTO numstr SEPARATED BY SPACE.
  ENDLOOP.
  CONCATENATE numstr 'DOLLARS' INTO numstr SEPARATED BY SPACE.
*begin轉化小數部分

  SEARCH numxs FOR '00'.
  IF sy-subrc <> 0.

    PERFORM TRANSSW USING numxs CHANGING numxsstr.

    CONCATENATE numxsstr 'CENTS ONLY' INTO numxsstr SEPARATED BY SPACE.
  ENDIF.
*end轉化小數部分

  CONCATENATE numstr numxsstr INTO numstr SEPARATED BY SPACE.
ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  TRANSBW
*       轉化百位
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VALUE(HUN) text
*      -->HUNSTR     text
*----------------------------------------------------------------------*

FORM TRANSBW USING value(hun) CHANGING hunstr.
  DATA len TYPE i.
  DATA sw TYPE i.
  DATA swstr TYPE STRING.
  DATA hunstrtemp TYPE STRING.
  DATA tempc(1) TYPE C.

  len = strlen( hun ).

  CASE len.
    WHEN 1.
      PERFORM TRANSGW USING hun CHANGING hunstr.
    WHEN 2.
      PERFORM TRANSSW USING hun CHANGING hunstr.
    WHEN 3.
      tempc = hun.
      sw = hun MOD 100.
      PERFORM TRANSGW USING tempc CHANGING hunstr.
      CONCATENATE hunstr 'HUNDRED' INTO hunstr SEPARATED BY SPACE.

      IF sw >= 10.
        PERFORM TRANSSW USING sw CHANGING swstr.
      ELSE.
        PERFORM TRANSGW USING sw CHANGING swstr.
      ENDIF.

      IF swstr <> ''.
        CONCATENATE hunstr 'AND' swstr INTO hunstr SEPARATED BY SPACE.
      ENDIF.

  ENDCASE.

ENDFORM.                    "TRANSBW


*轉化個位
FORM TRANSGW USING value(x) CHANGING dxx.
  CASE x.
    WHEN '0'.
      dxx = ''.
    WHEN '1'.
      dxx = 'ONE'.
    WHEN '2'.
      dxx = 'TWO'.
    WHEN '3'.
      dxx = 'THREE'.
    WHEN '4'.
      dxx = 'FOUR'.
    WHEN '5'.
      dxx = 'FIVE'.
    WHEN '6'.
      dxx = 'SIX'.
    WHEN '7'.
      dxx = 'SEVEN'.
    WHEN '8'.
      dxx = 'EIGHT'.
    WHEN '9'.
      dxx = 'NINE'.
  ENDCASE.
ENDFORM.                    "TRANSGW

*    轉化十位
FORM TRANSSW USING value(x) CHANGING dxx.
  DATA tempc TYPE i.
  DATA tengw TYPE i.
  DATA hunstrtemp TYPE STRING.

  CASE x.
    WHEN 10.
      dxx = 'TEN'.
    WHEN 11.
      dxx = 'ELEVEN'.
    WHEN 12.
      dxx = 'TWELVE'.
    WHEN 13.
      dxx = 'THIRTEEN'.
    WHEN 14.
      dxx = 'FOURTEEN'.
    WHEN 15.
      dxx = 'FIFTEEN'.
    WHEN 16.
      dxx = 'SIXTEEN'.
    WHEN 17.
      dxx = 'SEVENTEEN'.
    WHEN 18.
      dxx = 'EIGHTEEN'.
    WHEN 19.
      dxx = 'NINETEEN'.
    WHEN OTHERS.
      tempc = x DIV 10.
      CASE tempc.
        WHEN 2.
          dxx = 'TWENTY'.
        WHEN 3.
          dxx = 'THIRTY'.
        WHEN 4.
          dxx = 'FORTY'.
        WHEN 5.
          dxx = 'FIFTY'.
        WHEN 6.
          dxx = 'SIXTY'.
        WHEN 7.
          dxx = 'SEVENTY'.
        WHEN 8.
          dxx = 'EIGHTY'.
        WHEN 9.
          dxx = 'NINETY'.
      ENDCASE.
      tengw = x MOD 10.
      IF tengw > 0.
        PERFORM TRANSGW USING tengw CHANGING hunstrtemp.
        CONCATENATE dxx hunstrtemp INTO dxx SEPARATED BY SPACE.
      ENDIF.
  ENDCASE.
ENDFORM.                    "TRANSSW 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章