千分位

来源:互联网 发布:淘宝装修网站源码 编辑:程序博客网 时间:2024/04/27 13:24
在这个问题上我很是纠结了一番,最后的结果却叫我哭笑不得,一个字,囧。
解决这个问题,首先我将金额赋给字符型,结果千分位没了,可是只用金额型,负号又不能前提了,郁闷,没办法,只好另辟奚径了。
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:第二种方法是比较繁琐的一种方法,但也是万无一失的方法,用第一种方法有时可能会出现未知的错误,令人头痛。

原创粉丝点击