Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7202964
  • 博文数量: 655
  • 博客积分: 10264
  • 博客等级: 上将
  • 技术积分: 8278
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-04 17:47
个人简介

ABAP顾问

文章分类

全部博文(655)

文章存档

2017年(2)

2014年(8)

2013年(3)

2012年(2)

2011年(18)

2010年(102)

2009年(137)

2008年(274)

2007年(134)

分类:

2007-06-04 20:22:24

*&---------------------------------------------------------------------*
*& Report  Z_BARRY_CONV_AMOUNT                                         *
*&                                                                     *
*&---------------------------------------------------------------------*
*&  金额大写转换                                                        *
*&---------------------------------------------------------------------*
REPORT  Z_BARRY_CONV_AMOUNT                     .
TYPES: CUR6  TYPE P DECIMALS 6 ,
       CUR2  TYPE P DECIMALS 2 .
DATA VA1 TYPE CUR2.
DATA STR(40) TYPE C .
VA1 = '232.23'.
PERFORM CONV_AMOUNT USING VA1
                    CHANGING STR.
WRITE STR.
*&--------------------------------------------------------------------*
*&      Form  conv_amount
*&--------------------------------------------------------------------*
FORM CONV_AMOUNT USING VALUE(F_SOURCE)
                 CHANGING VALUE(F_RESULT).
  DATA: SCR(30) TYPE C, RES(60) TYPE C,FEN(2) TYPE C .
  DATA: LEN TYPE I, C1 TYPE I, C2 TYPE I, C3 TYPE I, C4 TYPE I.
  DATA: D1(1) TYPE C, D2(1) TYPE C, D3 TYPE I.
  DATA: DIGIT(2) TYPE C, WEIGHT(2) TYPE C.
  DATA: RULE1(20) TYPE C VALUE '零壹贰叁肆伍陆柒捌玖'.
  DATA: RULE2(30) TYPE C VALUE '分角元拾佰仟万拾佰仟亿拾佰仟万'.
  SCR = F_SOURCE * 100.
  CONDENSE SCR NO-GAPS.
  IF SCR = '0'.
    RES = '零元'.
  ELSE.
    LEN = STRLEN( SCR ).
    C1 = 0.
    D1 = '0'.
    CLEAR RES.
    DO LEN TIMES.
      C1 = C1 + 1.
      C2 = LEN - C1.
      D2 = SCR+C2(1) .
      IF D2 = '0'.
        D3 = 0.
      ELSE.
        D3 = D2 * 2.
      ENDIF.
      DIGIT = RULE1+D3(2) .
      C3 = ( C1 - 1 ) * 2.
      WEIGHT = RULE2+C3(2) .
      IF D2 = '0'.
        IF C1 = 3.
          DIGIT = ''.
        ELSEIF C1 = 7.
          DIGIT = ''.
          IF LEN > 10 .
            C4 = LEN - 10.
            IF SCR+C4(4) = '0000'.
              WEIGHT = ''.
            ENDIF.
          ENDIF.
        ELSEIF C1 = 11.
          DIGIT = ''.
        ELSEIF D1 = '0'.
          DIGIT = ''.
          WEIGHT = ''.
        ELSE.
          WEIGHT = ''.
        ENDIF.
      ENDIF.
*      CONCATENATE digit weight res INTO res. "汉字间是否加进空格
      CONCATENATE DIGIT WEIGHT RES INTO RES SEPARATED BY SPACE.
      D1 = D2.
    ENDDO.
  ENDIF.
  LEN = STRLEN( RES ) - 2.
  FEN = RES+LEN(2).
  IF FEN <> '分' .
    CONCATENATE RES ' 整' INTO F_RESULT.
  ELSE.
    F_RESULT = RES.
  ENDIF.
ENDFORM.                    "conv_amount
 
 
*------------------------------------------------------------*
FOR UNICODE 系统:
REPORT  z_barry_test NO STANDARD PAGE HEADING .
TYPES: CUR6  TYPE P DECIMALS 6 ,
       CUR2  TYPE P DECIMALS 2 .
DATA VA1 TYPE CUR2.
DATA STR(40) TYPE C .
VA1 = '1000123.5'.
PERFORM CONV_AMOUNT USING VA1
                    CHANGING STR.
WRITE STR.
*&--------------------------------------------------------------------*
*&      Form  conv_amount
*&--------------------------------------------------------------------*
FORM CONV_AMOUNT USING VALUE(F_SOURCE)
                 CHANGING VALUE(F_RESULT).
  DATA: SCR(30) TYPE C, RES(60) TYPE C,FEN(2) TYPE C .
  DATA: LEN TYPE I, C1 TYPE I, C2 TYPE I, C3 TYPE I, C4 TYPE I.
  DATA: D1(1) TYPE C, D2(1) TYPE C, D3 TYPE I.
  DATA: DIGIT(2) TYPE C, WEIGHT(2) TYPE C.
  DATA: RULE1(20) TYPE C VALUE '零壹贰叁肆伍陆柒捌玖'.
  DATA: RULE2(30) TYPE C VALUE '分角元拾佰仟万拾佰仟亿拾佰仟万'.
  SCR = F_SOURCE * 100.
  CONDENSE SCR NO-GAPS.
  IF SCR = '0'.
    RES = '零元'.
  ELSE.
    LEN = STRLEN( SCR ).
    C1 = 0.
    D1 = '0'.
    CLEAR RES.
    DO LEN TIMES.
      C1 = C1 + 1.
      C2 = LEN - C1.
      D2 = SCR+C2(1) .
      IF D2 = '0'.
        D3 = 0.
      ELSE.
        D3 = D2.
      ENDIF.
      DIGIT = RULE1+D3(1) .
      C3 = ( C1 - 1 ) .
      WEIGHT = RULE2+C3(1) .
      IF D2 = '0'.
        IF C1 = 3.
          DIGIT = ''.
        ELSEIF C1 = 7.
          DIGIT = ''.
          IF LEN > 10 .
            C4 = LEN - 10.
            IF SCR+C4(4) = '0000'.
              WEIGHT = ''.
            ENDIF.
          ENDIF.
        ELSEIF C1 = 11.
          DIGIT = ''.
        ELSEIF D1 = '0'.
          DIGIT = ''.
          WEIGHT = ''.
        ELSE.
          WEIGHT = ''.
        ENDIF.
      ENDIF.
      CONCATENATE DIGIT WEIGHT RES INTO RES .
      D1 = D2.
    ENDDO.
  ENDIF.
  LEN = STRLEN( RES ) - 1.
  FEN = RES+LEN(1).
  IF FEN <> '分' .
    CONCATENATE RES '整' INTO F_RESULT.
  ELSE.
    F_RESULT = RES.
  ENDIF.
ENDFORM.                    "conv_amount
 
 
***外币转换:
FUNCTION YLMM_SPELL_AMOUNT_EN.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(INPUT_AMOUNT) DEFAULT 0
*"  EXPORTING
*"     REFERENCE(OUTPUT_WORD) TYPE  SPELL-WORD
*"  EXCEPTIONS
*"      ERROR_INPUT_FORMAT
*"----------------------------------------------------------------------
  DATA : TEXT1(16) ,TEXT2(2) .
  DATA : AMOUNT(16) TYPE  P .
  DATA : SPELL TYPE SPELL.
  IF NOT INPUT_AMOUNT CO '0123456789. '.
    RAISE ERROR_INPUT_FORMAT.
  ENDIF.
  SPLIT INPUT_AMOUNT AT '.' INTO TEXT1 TEXT2.
  IF TEXT2 < 10 AND TEXT2+0(1) = '0'.
    WRITE TEXT2 TO TEXT2 NO-GAP NO-ZERO.
    CONDENSE TEXT2.
  ELSEIF TEXT2 < 10 AND TEXT2+0(1) <> '0'.
    TEXT2 = TEXT2 * 10.
  ENDIF.
  AMOUNT = TEXT1 .
  CALL FUNCTION 'SPELL_AMOUNT'
    EXPORTING
      AMOUNT    = AMOUNT
      LANGUAGE  = 'E'
    IMPORTING
      IN_WORDS  = SPELL
    EXCEPTIONS
      NOT_FOUND = 01
      TOO_LARGE = 02.
  AMOUNT = TEXT2.
  IF AMOUNT = 0 .
    CONCATENATE SPELL-WORD ' Dollars Only' INTO OUTPUT_WORD.
  ELSE.
    CONCATENATE SPELL-WORD ' Dollars AND' INTO OUTPUT_WORD .
    IF 1 = 1.
      CONCATENATE OUTPUT_WORD TEXT2 'Cents Only' INTO OUTPUT_WORD
        SEPARATED BY SPACE.
    ELSE.
      CALL FUNCTION 'SPELL_AMOUNT'
        EXPORTING
          AMOUNT    = AMOUNT
          LANGUAGE  = 'E'
        IMPORTING
          IN_WORDS  = SPELL
        EXCEPTIONS
          NOT_FOUND = 01
          TOO_LARGE = 02.
      CONCATENATE OUTPUT_WORD SPELL-WORD 'Cents Only' INTO OUTPUT_WORD
        SEPARATED BY SPACE.
    ENDIF.
  ENDIF.
ENDFUNCTION.
 
 
 
***日期大写
阅读(8656) | 评论(2) | 转发(0) |
0

上一篇:UP_DOWN_REQUEST

下一篇:SEARCH_ABAP_STRING

给主人留下些什么吧!~~

chinaunix网友2010-04-17 16:40:45

不错

chinaunix网友2009-03-30 22:46:11

这是我见过的最高效和准确的大写金额转换程序了