方法一:
按输入字符串处理
处理逻辑:
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.