SAP 金额转换成大写

系统中自带的函数SPELL_AMOUNT适用于没有小数的情况,如果金额带小数,结果就会出现问题,结果如下

SAP 金额转换成大写

这里有一个优化过的自定义小写转大写函数,源代码如下:

FUNCTION zfun_convert_money.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_VAL) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(E_DXSTR) TYPE  STRING
*"----------------------------------------------------------------------
  DATAzs(20).
  DATAxs(20).
  DATAstr(30).
  DATAlen TYPE i VALUE 0.
  DATAcis TYPE i VALUE 0.
  DATAlis TYPE i VALUE 0.
  DATAss(2).
  DATArr(1).
  DATAstrr(30).
  DATAchange(30TYPE c VALUE '1234567890'.
*data DXSTR type STRING value ''.
  DATA val TYPE DECIMALS .
  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 strlenzs )."整数长度
  CLEAR strr.
  cis len 1.
  DO len TIMES.
    MOVE zs+cis(1TO rr.
    CONCATENATE strr rr INTO strr.
    cis cis 1.
  ENDDO.

  cis 0.
  DO len TIMES.
    MOVE strr+cis(1TO 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 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 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(1TO ssTRANSLATE ss USING change.
    CONCATENATE e_dxstr ss ''  INTO e_dxstr.
    MOVE xs+1(1TO ssTRANSLATE 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.

SAP 金额转换成大写

SAP 金额转换成大写

运行结果如下:

SAP 金额转换成大写

经过理解发现这个函数有一个小小的BUG,如下:

SAP 金额转换成大写

SAP 金额转换成大写

稍作修改,加上上述代码中加粗标记的一段代码,结果如下:
SAP 金额转换成大写