千分位

在这个问题上我很是纠结了一番,最后的结果却叫我哭笑不得,一个字,囧。
解决这个问题,首先我将金额赋给字符型,结果千分位没了,可是只用金额型,负号又不能前提了,郁闷,没办法,只好另辟奚径了。
1、用WRITE...TO...将金额型写给C型,保留千分位,再使用下面这个函数就OK了
  IF is_result-amount  0.
            CALL  FUNCTION  'CLOI_PUT_SIGN_IN_FRONT'
                CHANGING
                    value is_result-amount.
        ENDIF.
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,
    TYPE i,
    zcstr(30)  TYPE c,
    zcstr2(30)  TYPE c,
    zctemp(3)  TYPE c,
    zflag(1)  TYPE  VALUE  '.',
    zflag2  TYPE  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.
                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.
ENDFORM                                                   " Form  NUMTOSTR

NOTE:第二种方法是比较繁琐的一种方法,但也是万无一失的方法,用第一种方法有时可能会出现未知的错误,令人头痛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值