ABAP 数字转换中文大写数字的方法

 写了2种转换的方式。显示XX元整,XX元角XX分

data:I_JE TYPE  BSEG-DMBTR VALUE '1234.891'.
data:e_JE TYPE  CHAR100.


  DATA:s_zs TYPE spell,
       s_j  TYPE spell,
       s_f  TYPE spell,
       v_nu TYPE char30,
       v_zs TYPE char30,
       v_xs TYPE char30,
       v_j  TYPE char30,
       v_f  TYPE char30.
  v_nu = i_je.
  SPLIT v_nu AT '.' INTO v_zs v_xs.
  v_j = v_xs(1).
  v_f = v_xs+1(1).

  IF v_zs <> '0' .
    CALL FUNCTION 'SPELL_AMOUNT'
      EXPORTING
        language = '1'   "sy-langu"
        currency = sy-waers
        amount   = v_zs
        filler   = ' '
      IMPORTING
        in_words = s_zs.
  ENDIF.


  CALL FUNCTION 'SPELL_AMOUNT'
    EXPORTING
      language = '1'   "sy-langu"
      currency = sy-waers
      amount   = v_j
      filler   = ' '
    IMPORTING
      in_words = s_j.


  IF v_f <> '0' .
    CALL FUNCTION 'SPELL_AMOUNT'
      EXPORTING
        language = '1'   "sy-langu"
        currency = sy-waers
        amount   = v_f
        filler   = ' '
      IMPORTING
        in_words = s_f.
  ENDIF.

  IF s_j-word = '零' AND s_f IS INITIAL .          "如果没有小数位数 如 11.00"
    CONCATENATE s_zs-word '元整' INTO e_je.
  ELSEIF s_zs IS INITIAL .                        "如果没有证书位 如 0.10 0.01 0.11"
    IF s_j-word <> '零' .
      CONCATENATE s_j-word '角' INTO e_je .
    ENDIF.
    IF s_f IS NOT INITIAL.
      CONCATENATE e_je s_f-word '分' INTO e_je.
    ENDIF.
  ELSE.                                           "如果整数小数位都有 如 11.01  11.10 11.11"
    CONCATENATE s_zs-word '元' INTO e_je.

    IF s_j-word = '零' AND s_f IS NOT INITIAL .
      CONCATENATE e_je s_j-word INTO e_je.
    ELSE.
      CONCATENATE e_je s_j-word '角' INTO e_je .
    ENDIF.

    IF s_f IS NOT INITIAL .
      CONCATENATE e_je s_f-word '分' INTO e_je.
    ENDIF.

  ENDIF.

  write e_je. 
FUNCTION zzf_spell_amount.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_AMOUNT) TYPE  STRING
*"     REFERENCE(IV_CURRENCY) TYPE  SY-WAERS DEFAULT 'CNY'
*"     REFERENCE(IV_LANGUAGE) TYPE  SY-LANGU DEFAULT SY-LANGU
*"  EXPORTING
*"     VALUE(EV_NUMBER_UPPER) TYPE  STRING
*"----------------------------------------------------------------------

*  DATA:lv_integer TYPE string, "整数
*       lv_dec     TYPE string, "小数
*       lv_dot     TYPE char1.

    DATA:lv_integer TYPE char100, "整数
       lv_dec     TYPE char100, "小数
       lv_dot     TYPE char1.

  DATA:ls_words_integer TYPE spell,
       ls_words_dec     TYPE spell,
       lv_length_dec    TYPE i.

  SELECT SINGLE *
    INTO @DATA(ls_usr01)
    FROM usr01
   WHERE bname EQ @sy-uname.

  CASE ls_usr01-dcpfm .
    WHEN ''.".'1.234.567,89'.
      lv_dot = '.'.
    WHEN 'X'."'1,234,567.89'.
      lv_dot = '.'.
    WHEN 'Y'."'1 234 567,89'.
      lv_dot = ','.
    WHEN OTHERS.
  ENDCASE.

  SPLIT iv_amount AT lv_dot INTO lv_integer lv_dec.
  lv_length_dec = strlen( lv_dec ).
  lv_integer = lv_integer && lv_dot && '00'.


  CALL FUNCTION 'SPELL_AMOUNT'
    EXPORTING
      amount    = lv_integer
      currency  = iv_currency
      filler    = ''
      language  = iv_language
    IMPORTING
      in_words  = ls_words_integer
    EXCEPTIONS
      not_found = 1
      too_large = 2.
  ev_number_upper = ls_words_integer-word.
  IF lv_dec IS NOT INITIAL and lv_dec ne '00'.
    lv_dec = lv_dec && lv_dot && '00'.
    CALL FUNCTION 'SPELL_AMOUNT'
      EXPORTING
        amount    = lv_dec
        currency  = iv_currency
        filler    = ''
        language  = iv_language
      IMPORTING
        in_words  = ls_words_dec
      EXCEPTIONS
        not_found = 1
        too_large = 2.
    DATA:lv_int       TYPE i,
         lv_int_char  TYPE char2,
         lv_str_pre   TYPE string VALUE 'LS_WORDS_DEC-DIG',
         lv_str_after TYPE string.
    FIELD-SYMBOLS:<fs_value> TYPE any.

    lv_int = lv_length_dec.

*    EV_NUMBER_UPPER = EV_NUMBER_UPPER && '点'.
    ev_number_upper = ev_number_upper && '元'.
    IF lv_int EQ '1'.
      DATA(lv_flag) = 'X'.
    ENDIF.
    DO .
      IF lv_int = 0.
        EXIT.
      ENDIF.

      lv_int_char = lv_int.
      lv_int_char = |{ lv_int_char ALPHA = IN }|.
      lv_str_after = lv_str_pre && lv_int_char.
      ASSIGN (lv_str_after) TO <fs_value>.
      IF <fs_value> IS ASSIGNED.
        ev_number_upper = ev_number_upper && <fs_value>.
      ENDIF.

      IF lv_int EQ  '2' OR lv_flag EQ 'X'.
        ev_number_upper = ev_number_upper && '角'.
      ELSEIF lv_int EQ '1'.
        ev_number_upper = ev_number_upper && '分'.
      ENDIF.
      lv_int = lv_int - 1.

    ENDDO.

  ELSE.
    ev_number_upper = ev_number_upper && '元整'.
  ENDIF.



ENDFUNCTION.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值