SAP 金额转换成大写
系统中自带的函数SPELL_AMOUNT适用于没有小数的情况,如果金额带小数,结果就会出现问题,结果如下
这里有一个优化过的自定义小写转大写函数,源代码如下:
FUNCTION zfun_convert_money.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_VAL) TYPE STRING OPTIONAL
*" EXPORTING
*" VALUE(E_DXSTR) TYPE STRING
*"----------------------------------------------------------------------
DATA: zs(20).
DATA: xs(20).
DATA: str(30).
DATA: len TYPE i VALUE 0.
DATA: cis TYPE i VALUE 0.
DATA: lis TYPE i VALUE 0.
DATA: ss(2).
DATA: rr(1).
DATA: strr(30).
DATA: change(30) TYPE c VALUE '1壹2贰3叁4肆5伍6陆7柒8捌9玖0零'.
*data DXSTR type STRING value ''.
DATA val TYPE p DECIMALS 2 .
val = i_val.
CLEAR e_dxstr.
MOVE val TO str.
SHIFT str LEFT DELETING LEADING space.
SPLIT str AT '.' INTO zs xs."把金额拆分成整数和小数
"把金额字段反过来比如123变成321
len = strlen( zs )."整数长度
CLEAR strr.
cis = len - 1.
DO len TIMES.
MOVE zs+cis(1) TO rr.
CONCATENATE strr rr INTO strr.
cis = cis - 1.
ENDDO.
cis = 0.
DO len TIMES.
MOVE strr+cis(1) TO ss.
IF ss <> 0.
TRANSLATE ss USING change.
CASE cis.
WHEN 0.
CONCATENATE ss '元' INTO e_dxstr.
WHEN 1.
CONCATENATE ss '拾' e_dxstr INTO e_dxstr.
WHEN 2.
CONCATENATE ss '佰' e_dxstr INTO e_dxstr.
WHEN 3.
CONCATENATE ss '仟' e_dxstr INTO e_dxstr.
WHEN 4.
CONCATENATE ss '万' e_dxstr INTO e_dxstr.
WHEN 5.
CONCATENATE ss '拾' e_dxstr INTO e_dxstr.
WHEN 6.
CONCATENATE ss '佰' e_dxstr INTO e_dxstr.
WHEN 7.
CONCATENATE ss '仟' e_dxstr INTO e_dxstr.
WHEN 8.
CONCATENATE ss '亿' e_dxstr INTO e_dxstr.
WHEN 9.
CONCATENATE ss '拾' e_dxstr INTO e_dxstr.
WHEN 10.
CONCATENATE ss '百' e_dxstr INTO e_dxstr.
WHEN 11.
CONCATENATE ss '仟' e_dxstr INTO e_dxstr.
ENDCASE.
ELSEIF ss = 0 AND strr+lis(1) = 0.
CASE cis.
WHEN 0.
IF lis <> 0.
CONCATENATE '元' e_dxstr INTO e_dxstr.
ELSE.
CONCATENATE '零元' e_dxstr INTO e_dxstr.
ENDIF.
WHEN 4.
CONCATENATE '万' e_dxstr INTO e_dxstr.
WHEN 8.
CONCATENATE '亿' e_dxstr INTO e_dxstr.
ENDCASE.
ELSEIF ss = 0 AND strr+lis(1) <> 0.
TRANSLATE ss USING change.
CASE cis.
WHEN 0.
CONCATENATE '元' ss e_dxstr INTO e_dxstr.
WHEN 4.
CONCATENATE '万' ss e_dxstr INTO e_dxstr.
WHEN 8.
CONCATENATE '亿' ss e_dxstr INTO e_dxstr.
WHEN OTHERS.
CONCATENATE ss e_dxstr INTO e_dxstr.
ENDCASE.
ENDIF.
lis = cis.
cis = cis + 1.
ENDDO.
CLEAR ss.
IF xs <> '00'.
MOVE xs+0(1) TO ss. TRANSLATE ss USING change.
CONCATENATE e_dxstr ss '角' INTO e_dxstr.
MOVE xs+1(1) TO ss. TRANSLATE ss USING change.
CONCATENATE e_dxstr ss '分' INTO e_dxstr.
ELSE.
CONCATENATE e_dxstr '整' INTO e_dxstr.
ENDIF.
IF e_dxstr = '元整'.
e_dxstr = '零元整'.
ENDIF.
ENDFUNCTION.
运行结果如下:
经过理解发现这个函数有一个小小的BUG,如下:
稍作修改,加上上述代码中加粗标记的一段代码,结果如下: