[SAP ABAP] - Spell Out Numbers (Amount) with Decimal Places

FUNCTION zfm_spell_amount.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(GV_AMOUNT) OPTIONAL
*"     VALUE(GV_WAERS) TYPE  WAERS DEFAULT 'USD'
*"     VALUE(GV_LANGU) LIKE  SY-LANGU DEFAULT 'i'
*"  EXPORTING
*"     REFERENCE(GV_WORDS) TYPE  IN_WORDS
*"----------------------------------------------------------------------
*"  Created by Alfian Dikara and Albertus Reinandang
*"----------------------------------------------------------------------
  DATA : lv_decimals    TYPE i,
         lv_input(20),
         lv_amount1(13),
         lv_amount2(10) TYPE n,
         lv_ktext       LIKE tcurt-ktext,
         lv_index       TYPE i,
         lv_nol         TYPE string,
         lw_usr01_exp   LIKE usr01,
         lw_words       TYPE spell.

  "Get Currency Text
  SELECT SINGLE ktext INTO lv_ktext
  FROM tcurt
  WHERE waers = gv_waers AND
        spras = sy-langu.

  TRANSLATE lv_ktext TO UPPER CASE.

  "Convert Amount to Character
  WRITE gv_amount CURRENCY gv_waers TO lv_input.
  CHECK ( lv_input IS NOT INITIAL ).

  CALL FUNCTION 'CETA_USR01_READ'
    EXPORTING
      bname     = sy-uname
    IMPORTING
      usr01_exp = lw_usr01_exp.
  .
  IF lw_usr01_exp-dcpfm NE 'X'.
    REPLACE ALL OCCURRENCES OF '.' IN lv_input WITH ''.
    SPLIT lv_input AT ',' INTO lv_amount1 lv_amount2.
  ELSE.
    REPLACE ALL OCCURRENCES OF ',' IN lv_input WITH ''.
    SPLIT lv_input AT '.' INTO lv_amount1 lv_amount2.
  ENDIF.

  "Check Nol in Decimal Amount
  IF lv_amount2 IS NOT INITIAL.

    DESCRIBE FIELD gv_amount DECIMALS lv_decimals.
    DO lv_decimals TIMES. " if gv_amount have 4 decimals then do 4 loop
      ADD TO lv_index.
      IF lv_amount2(lv_index) = 0.
        CONCATENATE 'NOL' lv_nol INTO lv_nol SEPARATED BY space.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
    CONDENSE lv_nol.

  ENDIF.

  "Get Spell Amount
  CALL FUNCTION 'SPELL_AMOUNT'
    EXPORTING
      amount    = lv_input
      currency  = gv_waers
*     FILLER    = ' '
      language  = gv_langu
    IMPORTING
      in_words  = lw_words
    EXCEPTIONS
      not_found = 1
      too_large = 2
      OTHERS    3.
  IF sy-subrc = 0.
    CONDENSE : lw_words-word, lw_words-decword.
    IF lv_nol IS INITIAL.
      CONCATENATE '(' lw_words-word ' KOMA' lw_words-decword lv_ktext ')'
      INTO gv_words SEPARATED BY space.
    ELSEIF lv_nol = 'X'.
      CONCATENATE '(' lw_words-word lv_ktext ')'
      INTO gv_words." SEPARATED BY space.
    ELSE.
      CONCATENATE '(' lw_words-word ' KOMA' lv_nol lw_words-decword lv_ktext ')'
      INTO gv_words SEPARATED BY space.
    ENDIF.
  ENDIF.

ENDFUNCTION.

Comments