ABAP:金额转换为中文大写,负数,小数点

FUNCTION ZFI_TOBIG.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_MONEY) TYPE  WRBTR
*"  EXPORTING
*"     REFERENCE(E_MONEY) TYPE  CHAR30
*"----------------------------------------------------------------------
  DATA: l_unicode   TYPE c LENGTH 1,
        l_money_str TYPE c LENGTH 23,
        cword       TYPE c LENGTH 2,
        weight      TYPE c LENGTH 2,
        units       TYPE c LENGTH 30 VALUE '分角元拾佰仟万拾佰仟亿拾佰仟万',
        digts       TYPE c LENGTH 20 VALUE '零壹贰叁肆伍陆柒捌玖'.

  DATA: l_position  TYPE i,
        units_off   TYPE i,
        curnt_off   TYPE i,
        l_four      TYPE i,
        l_step      TYPE i.

  DATA: lastd       TYPE n,
        curntd      TYPE n.

  DATA: lv_flag     TYPE c.                           "金额是否为负 标识

* 判断系统是否是unicode,确定步长
  CALL FUNCTION 'TR_GET_IS_UNICODE_SYSTEM'
    IMPORTING
      ev_is_unicode_system = l_unicode.

  IF l_unicode = 'X'.
    l_step = 1.
  ELSE.
    l_step = 2.
  ENDIF.

*0单独处理
  IF i_money = 0.
    e_money = '零'.
    EXIT.
  ENDIF.

* 借用系统函数,在此检查金额的合法性
  l_money_str = i_money.
*  CALL FUNCTION 'FKK_AMOUNT_CHECK_AND_CONVERT'
*    EXPORTING
*      i_amount             = l_money_str
*      i_waers              = 'CNY'
*    EXCEPTIONS
*      invalid_input_format = 1
*      OTHERS               = 2.
*  IF sy-subrc <> 0.
*    RAISE wrong_money.
*  ENDIF.

  REPLACE ALL OCCURRENCES OF REGEX '\-'   IN l_money_str WITH ''.        "删除 - 符号
  IF sy-subrc = 0.            "如果为负数
    lv_flag = 'X'.
  ENDIF.

* 将小数点去掉
  IF l_money_str CS '.'.
    REPLACE FIRST OCCURRENCE OF '.' IN l_money_str
      WITH space IN CHARACTER MODE.
  ENDIF.

  CONDENSE l_money_str NO-GAPS.

* 构造大写文本
  lastd = 0.
  curnt_off = strlen( l_money_str ) - 1.

  WHILE curnt_off >= 0.

    curntd = l_money_str+curnt_off(1).
    l_position = curntd * l_step.
    cword  = digts+l_position(l_step).
    weight = units+units_off(l_step).
    l_position = units_off / l_step.

    IF curntd = 0.             "Current digit is 0
      IF l_position = 2 OR l_position = 6 OR l_position = 10.
        CLEAR:cword.
        IF curnt_off = 0.
          CLEAR:weight.
        ENDIF.

        l_four = curnt_off - 3.
        IF l_four < 0.
          l_four = 0.
        ENDIF.
        IF l_position > 2 and ( l_money_str+l_four(3) = '000' OR l_money_str+l_four(3) = '00' OR l_money_str+l_four(3) = '0' ).
          CLEAR:weight.
        ENDIF.

      ELSEIF lastd = 0.
        CLEAR:cword,weight.
      ELSE.
        CLEAR:weight.
      ENDIF.
    ENDIF.

    CONCATENATE cword weight e_money INTO e_money.

    lastd = curntd.
    curnt_off = curnt_off - 1.
    units_off = units_off + l_step.
  ENDWHILE.

* 处理前缀(零)和后缀(整)
  IF e_money NS '分'.
    CONCATENATE e_money '整' INTO e_money.
  ELSE.
    cword = e_money+0(l_step).
    IF cword = '零'.
      SHIFT e_money BY l_step PLACES.
    ENDIF.
  ENDIF.
*   大小写转换新增负数 
  IF lv_flag = 'X'.
    CONCATENATE '负' E_MONEY INTO E_MONEY.
    CLEAR lv_flag.
  ENDIF.

ENDFUNCTION.

带负数小数点:
在这里插入图片描述
在这里插入图片描述
小数点:
在这里插入图片描述
在这里插入图片描述
整数:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值