您的位置:首页 > 其它

ABAP 负号 提前

2011-08-30 11:08 176 查看
SAP中的负号是放后面的,其实也无所谓,谁看不出来啊,关键人家要你改也没有办法。有个函数CLOI_PUT_SIGN_IN_FRONT是把负号提前的,但是它是把字符转化为字符型输出的。就是把负号split下然后放前面,这样的问题就是在显示的时候字符型数字没有3位一分的千位分隔符。再把字符型赋予数字型输出,但是输出的时候负号还是会自动加后面滴~
CALL
FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'

CHANGING

VALUE = gt_table-column5.

问MK了下,告诉我用write to语句把负数取绝对值,然后把数字型写入字符型可以保留千位符,再判断正负数,在输出的时候添上负号。在FORM里我就是这样改的了,很方便。

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.

FR告诉我手动把字符型加千位符的,取整,判断长度,除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.

************************************************************************

我根据上面提供的函数进行了测试,出现了一些BUG,我对他进行了完善和修改。

修改如下:

FORM NUMTOSTR USING VALUE(ZNUM) CHANGING VALUE(ZSTR).

DATA : ZCLEN TYPE I,

ZCLEN2 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 < 0.

ZFLAG2 = 1.

ZNUM = ABS( ZNUM ).

ENDIF.

IF ZNUM >= 0.

ZCSTR = ZNUM.

* 压缩字符串,去除前面的空格。

CONDENSE ZCSTR NO-GAPS.

* 分离整数与小数,好单独处理整数。

SPLIT ZCSTR AT ZFLAG INTO ZCSTR ZCDEC.

ZCLEN = STRLEN( ZCSTR ).

ZCLEN2 = ZCLEN.

* 在循环中从右面在每三位的前面加上一个逗号。

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.

* 将不剩下的不足三位数加到前面

IF ZCLEN2 > 3 .

CONCATENATE ZCSTR+0(ZCLEN) ZCSTR2 INTO ZCSTR2 SEPARATED BY ','.

ELSE.

ZCSTR2 = ZCSTR+0(ZCLEN).

ENDIF.

IF ZFLAG2 = 1.

CONCATENATE '-' ZCSTR2 INTO ZCSTR2.

ENDIF.

CLEAR ZCSTR.

* 将处理过的整数与小数连接起来。

IF ZCDEC <> ''.

CONCATENATE ZCSTR2 ZCDEC INTO ZCSTR SEPARATED BY ZFLAG.

ELSE.

ZCSTR = ZCSTR2.

ENDIF.

* 将值返回

ZSTR = ZCSTR.

ELSE.

ZSTR = ZNUM.

ENDIF.

ENDFORM.

*************************************************************************

write时将'-'号提前

PERFORM change_qty USING l_srqty

CHANGING it_inv-srqty.

FORM change_qty USING p_qty

CHANGING p_qty1.

p_qty1 = p_qty.

SHIFT p_qty1 LEFT DELETING LEADING ' '.

SHIFT p_qty1 UP TO '-' LEFT CIRCULAR.

CONDENSE p_qty1 NO-GAPS.

ENDFORM. " change_qty

********************************************************************************************

目的:将字符串尾的负号放在字符串首

CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'

CHANGING

value = itab-amunt.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: