写了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.