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