在这个问题上我很是纠结了一番,最后的结果却叫我哭笑不得,一个字,囧。
IF is_result-amount
<
0.
CALL
FUNCTION
'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value =
is_result-amount.
ENDIF.
解决这个问题,首先我将金额赋给字符型,结果千分位没了,可是只用金额型,负号又不能前提了,郁闷,没办法,只好另辟奚径了。
1、用WRITE...TO...将金额型写给C型,保留千分位,再使用下面这个函数就OK了
2、起先我是遇到了使用WRITE...TO...语法一直报错的问题,很是纠结了一会儿,没招儿,只好另觅他法,也是先将金额型赋给C型,然后将负号前提,此时丢失千分位,下面是关键的一步了,写一个FORM,强制给字段加上千分位符号,说白了,就是对字符串的操作,拆分整数和小数部分,整数部分三位一加逗号,最后再和小数部分拼起来,FORM如下:
*&---------------------------------------------------------------------*
*& Form NUMTOSTR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->VALUE text
* -->(ZNUM) text
* -->VALUE text
* -->(ZSTR) text
*----------------------------------------------------------------------*
FORM numtostr
CHANGING p_is_result_amount
p_is_result_amount_h
p_is_result_total
p_is_result_total_h.
DATA :
zclen
TYPE i,
n
TYPE i,
zcstr(30)
TYPE c,
zcstr2(30)
TYPE c,
zctemp(3)
TYPE c,
zflag(1)
TYPE
c
VALUE
'.',
zflag2
TYPE
i
VALUE 0,
zcdec(30)
TYPE c,
"记录小数部分.
znum(30),
znum_h(30),
ztotal(30),
ztotal_h(30).
"zstr = ''.
znum
=
is_result-amount.
znum_h
=
is_result-amount_h.
ztotal
=
is_result-total.
ztotal_h
=
is_result-total_h.
CLEAR:
is_result-amount,is_result-amount_h,is_result-total,is_result-total_h.
*---------------------------------------------------------------------------------------------*1
IF znum
<>
0.
IF znum
<=
-1000.
zflag2
=
1.
znum
=
znum
*
(
-1
).
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.
* 将处理过的整数与小数连接起来。
IF strlen(
zcdec
)
>
1.
CONCATENATE zcstr2
zcdec
INTO zcstr
SEPARATED
BY zflag.
ELSE.
CONCATENATE zcdec
'00'
INTO zcdec.
CONCATENATE zcstr2
zcdec
INTO zcstr
SEPARATED
BY zflag.
ENDIF.
* 将值返回
is_result-amount
=
zcstr.
ELSE.
is_result-amount
=
znum.
ENDIF.
ENDIF.
CLEAR:
zflag2,zcstr,zcdec,zclen,zctemp,zcstr2,n.
*&
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*
*
*
*----------------------------------------------------------------------*
FORM
*---------------------------------------------------------------------------------------------*1
*
*
*
*
*
*
ENDFORM
"
Form NUMTOSTR
NOTE:第二种方法是比较繁琐的一种方法,但也是万无一失的方法,用第一种方法有时可能会出现未知的错误,令人头痛。