符号前置
第一种:使用函数CLOI_PUT_SIGN_IN_FRONT
REPORT ZGY_TEST.
TABLES : BSEG.
DATA : E_DMBTR TYPE STRING.
E_DMBTR = '100-'.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
VALUE = E_DMBTR.
WRITE : E_DMBTR.
这个的局限是只能用字符类型进行操作,这样就不是金额这样的数字类型了,对于对齐等也都和金额类型不同,同时会导致千分位符号丢失。
用write to语句把负数取绝对值,然后把数字型写入字符型可以保留千位符,再判断正负数,在输出的时候添上负号。
Form asset_front_minus changing value1.
value2 = abs( value1 ).
write value2 to string1.
condense string1.
if value1 < 0.
write: '-', string1 LEFT-JUSTIFIED NO-GAP NO-ZERO.
else.
write: string1 LEFT-JUSTIFIED NO-GAP NO-ZERO.
endif.
endform.
第二种:
这种方法手动添加千分位符号,以下是来自网上的实现方法:
手动把字符型加千位符的,取整,判断长度,除3以后循环mask”_,”格式,分割,再处理头3位。
FORM NUMTOSTR USING VALUE(ZNUM) CHANGING VALUE(ZSTR).
DATA : ZCLEN TYPE I,
N TYPE I,
ZCSTR(20) TYPE C,
ZCSTR2(20) TYPE C,
ZCTEMP(3) TYPE C,
ZFLAG(1) TYPE C VALUE '.',
ZFLAG2 TYPE I VALUE 0,
ZCDEC(20) TYPE C. "记录小数部分
ZSTR = ''.
CHECK ZNUM <> 0.
IF ZNUM <= -1000.
ZFLAG2 = 1.
ZNUM = ABS( ZNUM ).
ENDIF.
IF ZNUM >= 1000.
ZCSTR = ZNUM.
* 压缩字符串,去除前面的空格。
CONDENSE ZCSTR NO-GAPS.
* 分离整数与小数,好单独处理整数。
SPLIT ZCSTR AT ZFLAG INTO ZCSTR ZCDEC.
ZCLEN = STRLEN( ZCSTR ).
* 在循环中从右面在每三位的前面加上一个逗号。
WHILE ZCLEN > 3.
N = ZCLEN - 3.
ZCTEMP = ZCSTR+N(3).
IF NOT ZCSTR2 IS INITIAL.
CONCATENATE ZCTEMP ZCSTR2 INTO
ZCSTR2 SEPARATED BY ','.
ELSE.
ZCSTR2 = ZCTEMP.
ENDIF.
ZCLEN = ZCLEN - 3.
ENDWHILE.
* 将不剩下的不足三位数加到前面
CONCATENATE ZCSTR+0(ZCLEN) ZCSTR2
INTO ZCSTR2 SEPARATED BY ','.
IF ZFLAG2 = 1.
CONCATENATE '-' ZCSTR2 INTO ZCSTR2.
ENDIF.
CLEAR ZCSTR.
* 将处理过的整数与小数连接起来。
CONCATENATE ZCSTR2 ZCDEC INTO
ZCSTR SEPARATED BY ZFLAG.
* 将值返回
ZSTR = ZCSTR.
ELSE.
ZSTR = ZNUM.
ENDIF.
ENDFORM.
第三种:
这种方法相对于前两种方法的优点是,一.类型还是金额等数字类型,负号实现前置;二.几乎不用写很多代码,且可以保留千分位;三.适用于多个这样的字段修改需求。