ABAP替换字符串中的千分位字符


方法一:

       按输入字符串处理

处理逻辑:

abap小数点有两种:逗号(,)跟点号(.),千分位字符也分为这两种,本方法只为去掉千分位字符

1、查找点号跟逗号的个数

2、若点号个数大于1且逗号个数也大于1,则该数字为错误类型数字,退出程序

3、若点号个数大于1,则用空格替换到字符串中的所有点号,然后去空格

4、若逗号个数大于1,则用空格替换掉字符串中的所有逗号,然后去空格

5、若点号个数 =  逗号个数 =  1:

      1)、若点号所在位置比逗号所在位置靠前,则用空格替换点号,然后去空格

      2)、若逗号所在位置比点号所在位置靠前,则用空格替换逗号,然后去空格

6、若点号个数为1,逗号个数为0,且点号所在位置不为倒数第三个,则用空格替换点号,然后去空格

7、若逗号个数为1,点号个数为0,且逗号所在位置不为倒数第三个,则用空格替换逗号,然后去空格


*&---------------------------------------------------------------------*
*&      Form  F_DIGIT_CONVERSION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PV_DIGIT_STR  text Before conversion str
*      -->PV_CON_STR    text After conversion str
*      -->PV_FLAG       text
*      -->PV_MSG        text
*----------------------------------------------------------------------*
FORM F_DIGIT_CONVERSION  USING    PV_DIGIT_STR
                         CHANGING PV_CON_STR
                                  PV_FLAG
                                  PV_MSG.


  DATA: LT_TAB          TYPE TABLE OF STRING WITH HEADER LINE.
  DATA: LV_STR          TYPE STRING,
        LV_STR_TMP      TYPE STRING.
  DATA: LV_LINE_DOT     TYPE I,
        LV_LINE_COMMA   TYPE I,
        LV_LENGTH       TYPE I.
  DATA: LV_DOT_DOPS     TYPE SY-FDPOS,
        LV_COMMA_DOPS   TYPE SY-FDPOS.

  DATA: LV_MSG          TYPE STRING VALUE ' is error,Please check it'.
  CONSTANTS:
        LC_DOT          TYPE CHAR1 VALUE '.',
        LC_COMMA        TYPE CHAR1 VALUE ','.

  CHECK PV_DIGIT_STR IS NOT INITIAL.

  LV_STR = PV_DIGIT_STR.

  SPLIT LV_STR AT LC_DOT INTO TABLE LT_TAB.
  LV_LINE_DOT = LINES( LT_TAB[] ) - 1.

  READ TABLE LT_TAB INTO LV_STR_TMP INDEX 1.
  LV_DOT_DOPS = STRLEN( LV_STR_TMP ).

  CLEAR:LT_TAB,LT_TAB[].
  SPLIT LV_STR AT LC_COMMA INTO TABLE LT_TAB.
  LV_LINE_COMMA = LINES( LT_TAB[] ) - 1.

  SEARCH LV_STR FOR LC_COMMA.
  LV_COMMA_DOPS = SY-FDPOS.

  IF LV_LINE_DOT   > 1 AND
     LV_LINE_COMMA > 1.
    PV_FLAG = 'X'.
    CONCATENATE LV_STR LV_MSG INTO LV_MSG.
    PV_MSG  = LV_MSG.
    RETURN.
  ENDIF.

  IF LV_LINE_DOT > 1.
    PERFORM F_UP_STR USING LC_DOT CHANGING LV_STR.
  ENDIF.

  IF LV_LINE_COMMA > 1.
    PERFORM F_UP_STR USING LC_COMMA CHANGING LV_STR.
  ENDIF.

  IF LV_LINE_DOT   = 1 AND
     LV_LINE_COMMA = 1.

    IF LV_DOT_DOPS > LV_COMMA_DOPS..
      PERFORM F_UP_STR USING LC_COMMA CHANGING LV_STR.
    ELSE.
      PERFORM F_UP_STR USING LC_DOT CHANGING LV_STR.
    ENDIF.
  ENDIF.

  LV_LENGTH = STRLEN( LV_STR ) - 3.

  IF LV_LINE_DOT   EQ 1 AND
     LV_LINE_COMMA EQ 0 AND
     LV_DOT_DOPS   NE LV_LENGTH.
    PERFORM F_UP_STR USING LC_DOT CHANGING LV_STR.
  ENDIF.

  IF LV_LINE_DOT   EQ 0 AND
     LV_LINE_COMMA EQ 1 AND
     LV_COMMA_DOPS NE LV_LENGTH.
    PERFORM F_UP_STR USING LC_COMMA CHANGING LV_STR.
  ENDIF.

  CONDENSE LV_STR NO-GAPS.
  PV_CON_STR = LV_STR.

ENDFORM.                    " F_DIGIT_CONVERSION
*&---------------------------------------------------------------------*
*&      Form  F_UP_STR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PV_SP      text
*      -->PV_STR     text
*----------------------------------------------------------------------*
FORM F_UP_STR  USING    PV_SP
               CHANGING PV_STR.

  DO.
    REPLACE PV_SP WITH '' INTO PV_STR.
    IF SY-SUBRC NE 0.
      EXIT.
    ENDIF.
  ENDDO.

ENDFORM.                    "F_UP_STR

方法二:

       按系统千分位处理

       (来自博客:http://blog.csdn.net/justicezhengyi/article/details/8609914


如: 123,456.78  -> 123456.78
 
REPORT  z_barry_test NO STANDARD PAGE HEADING .
 
TABLES usr01.
DATA: pp TYPE p DECIMALS 2 . "注意这个地方的定义
 
SELECT SINGLE * FROM usr01 WHERE bname = sy-uname.
CALL FUNCTION 'UNITS_STRING_CONVERT'
  EXPORTING
    units_string = '12,345.7'
    dcpfm        = usr01-dcpfm
  IMPORTING
    units        = pp
  EXCEPTIONS
    invalid_type = 1
    OTHERS       = 2.
 
WRITE pp.





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值