ABAP 负号 提前

来源:互联网 发布:面向接口编程的好处 编辑:程序博客网 时间:2024/05/18 23:27
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_minuschanging value1.
   value2 = abs( value1 ).
write value2to string1.
   condense string1.
   if value1 <0.
   write:'-', string1 LEFT-JUSTIFIEDNO-GAP NO-ZERO.
   else.
   write: string1LEFT-JUSTIFIED NO-GAPNO-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.