zoukankan      html  css  js  c++  java
  • ABAP将数字金额转换为人民币大写字符串(增加UNICODE版本)

    1、No Uncode Version

    FUNCTION Z_CONVERT_NUMERIC_TO_CHINESE.
    *"----------------------------------------------------------------------
    *"*"Local interface:
    *"  IMPORTING
    *"     VALUE(PI_MONEY) LIKE  BSEG-DMBTR
    *"  EXPORTING
    *"     REFERENCE(PO_CHINESE)
    *"  EXCEPTIONS
    *"      WRONG_MONEY
    *"----------------------------------------------------------------------
      DATA:MONEY_STR(16).
      DATA:I TYPE I,
           J TYPE I,
           UNITS_OFF TYPE I,
           CURNT_OFF TYPE I.
      DATA:LASTD TYPE N,CURNTD TYPE N.
      DATA:CWORD(2),CUNIT(2),OCUNIT(2).
      IF PI_MONEY = 0.
        PO_CHINESE = '零'.
        EXIT.
      ENDIF.
      MONEY_STR = PI_MONEY.
      IF MONEY_STR CN '0123456789. '.
        RAISE WRONG_MONEY.
      ENDIF.
    *人为删除小数点
      IF MONEY_STR CS '.'.
        I = SY-FDPOS + 1.
        MONEY_STR+SY-FDPOS = MONEY_STR+I.
      ENDIF.
      CONDENSE MONEY_STR NO-GAPS.
      DATA:UNITS(30) VALUE '分角元拾佰仟万拾佰仟亿拾佰仟万',
           DIGTS(20) VALUE '零壹贰叁肆伍陆柒捌玖'.
      LASTD = 0.
      CURNT_OFF = STRLEN( MONEY_STR ) - 1.
      CLEAR OCUNIT.
      WHILE CURNT_OFF >= 0.
        CURNTD = MONEY_STR+CURNT_OFF(1). "提取数字
        I = CURNTD * 2.
        CWORD = DIGTS+I(2).              "取数字对应的汉字
        CUNIT = UNITS+UNITS_OFF(2).      "取单位
        I = UNITS_OFF / 2.               "取单位对应的位置
        IF CURNTD = 0.                   "Current digit is 0
          IF I = 2.
            CLEAR:CWORD.
            IF CURNT_OFF = 0.            "最后一个数字为0清除单位
              CLEAR:CUNIT.
            ENDIF.
          ELSEIF I = 6 OR I = 10.
            OCUNIT = CUNIT.
            CLEAR:CWORD.
            CLEAR:CUNIT.
            IF CURNT_OFF = 0.            "最后一个数字为0清除单位
            ENDIF.
          ELSEIF LASTD = 0.              "前面的一个数字是零则避免再次填写零
            CLEAR:CWORD,CUNIT.
          ELSE.
            CLEAR:CUNIT.
          ENDIF.
        elseif I = 10.
          CLEAR OCUNIT.
        ENDIF.
        IF OCUNIT ne space and  CURNTD ne 0.
          CONCATENATE OCUNIT PO_CHINESE INTO PO_CHINESE.
          CLEAR OCUNIT.
        endif.
        CONCATENATE CWORD CUNIT PO_CHINESE INTO PO_CHINESE.
        LASTD = CURNTD.
        SUBTRACT 1 FROM CURNT_OFF.
        ADD 2 TO UNITS_OFF.
      ENDWHILE.
      IF PO_CHINESE NS '分'.
        CONCATENATE PO_CHINESE '整' INTO PO_CHINESE.
      ELSE.
        CWORD = PO_CHINESE.
        IF CWORD = '零'.
          SHIFT PO_CHINESE BY 2 PLACES.
        ENDIF.
      ENDIF.
    ENDFUNCTION.

    2 Unicode Version

    FUNCTION zfuc_numeric_to_chinese.
    *"----------------------------------------------------------------------
    *"*"Local Interface:
    *"  IMPORTING
    *"     REFERENCE(IV_MONEY) TYPE  BF_DMBTR
    *"  EXPORTING
    *"     REFERENCE(EV_MONEY)
    *"  EXCEPTIONS
    *"      WRONG_MONEY
    *"----------------------------------------------------------------------
      IF iv_money = 0.
        ev_money = '零'.
        EXIT.
      ENDIF.
      DATA:money_str(33).
      money_str = iv_money.
       CONDENSE money_str NO-GAPS.
      IF money_str CN '0123456789. '.
        RAISE wrong_money.
      ENDIF.
      DATA:i TYPE i.
      IF money_str CS '.'.
        i = sy-fdpos + 1.
        money_str+sy-fdpos = money_str+i.
      ENDIF.
      CONDENSE money_str NO-GAPS.
      DATA:units_off TYPE i,
           curnt_off TYPE i.
      DATA:lastd TYPE n,curntd TYPE n.
      DATA:cword(2),weight(2).
      DATA:units(30) VALUE '分角元拾佰仟万拾佰仟亿拾佰仟万',
           digts(20) VALUE '零壹贰叁肆伍陆柒捌玖'.

    * clear:ev_money,units_off.
      lastd = 0.
      curnt_off = STRLEN( money_str ) - 1.
      WHILE curnt_off >= 0.
        curntd = money_str+curnt_off(1).
        i = curntd.
        cword = digts+i(1).

        weight = units+units_off(1).

        i = units_off / 1.
        IF curntd = 0.             "Current digit is 0
          IF i = 2 OR i = 6 OR i = 10.
            CLEAR:cword.
            IF curnt_off = 0.
              CLEAR:weight.
            ENDIF.
          ELSEIF lastd = 0.
            CLEAR:cword,weight.
          ELSE.
            CLEAR:weight.
          ENDIF.
        ENDIF.
        CONCATENATE cword weight ev_money INTO ev_money.
        lastd = curntd.
        SUBTRACT 1 FROM curnt_off.
        ADD 1 TO units_off.
      ENDWHILE.
      IF ev_money NS '分'.
        CONCATENATE ev_money '整' INTO ev_money.
      ELSE.
        cword = ev_money.
        IF cword = '零'.
          SHIFT ev_money BY 1 PLACES.
        ENDIF.
      ENDIF.

    ENDFUNCTION.

  • 相关阅读:
    转 无障碍阅读 role aria-*
    (转)edm注意事项
    Spring IOC机制之使用注解配置bean
    Spring IOC机制使用SpEL
    使用Spring IOC容器引用外部属性文件
    如何将属性文件中的值保存到类中
    基于XML的类的属性的装配
    Java——事务
    Eclipse中使用Spring IOC容器的具体方法
    Java之批处理的实现
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157519.html
Copyright © 2011-2022 走看看