SAP中负数的表示增强 负号从数字后更改到数字前面

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


CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'

        CHANGING

          VALUE = gt_table-column5.
 

问同事了下,告诉我用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.
 

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用8086指令系统求输入两个数字的平方差的汇编代码,对于负数结果输出负号: ``` org 100h ;指定程序的起始地址为100h section .data ;定义数据段 msg1 db 'Enter first number: $' ;提示输入第一个数字的消息 msg2 db 'Enter second number: $' ;提示输入第二个数字的消息 msg3 db 'The square difference is: $' ;输出平方差的消息 msg4 db '-$' ;输出负号的消息 section .bss ;定义未初始化数据段 num1 resw 1 ;定义第一个数字变量 num2 resw 1 ;定义第二个数字变量 diff resw 1 ;定义平方差变量 section .text ;定义代码段 start: ;程序入口 ;输入第一个数字 mov ah, 9 ;设置ah寄存器,表示输出字符串 mov dx, msg1 ;将msg1的地址存入dx寄存器 int 21h ;调用21h断,输出msg1的内容 mov ah, 1 ;设置ah寄存器,表示输入字符 int 21h ;调用21h断,输入字符 sub al, '0' ;将输入的字符转换成数字 mov word [num1], ax ;将数字存入num1变量 ;输入第二个数字 mov ah, 9 ;设置ah寄存器,表示输出字符串 mov dx, msg2 ;将msg2的地址存入dx寄存器 int 21h ;调用21h断,输出msg2的内容 mov ah, 1 ;设置ah寄存器,表示输入字符 int 21h ;调用21h断,输入字符 sub al, '0' ;将输入的字符转换成数字 mov word [num2], ax ;将数字存入num2变量 ;计算平方差 mov ax, [num1] ;将num1的值存入ax寄存器 mul ax ;将ax寄存器的值乘以自己 mov bx, ax ;将结果存入bx寄存器 mov ax, [num2] ;将num2的值存入ax寄存器 mul ax ;将ax寄存器的值乘以自己 sub bx, ax ;将bx寄存器的值减去ax寄存器的值,得到平方差 mov word [diff], bx ;将平方差存入diff变量 ;输出平方差 mov ah, 9 ;设置ah寄存器,表示输出字符串 mov dx, msg3 ;将msg3的地址存入dx寄存器 int 21h ;调用21h断,输出msg3的内容 mov ax, [diff] ;将diff的值存入ax寄存器 cmp ax, 0 ;比较ax寄存器的值和0 jge positive ;如果ax寄存器的值大于等于0,跳转到positive标签 mov ah, 9 ;设置ah寄存器,表示输出字符串 mov dx, msg4 ;将msg4的地址存入dx寄存器 int 21h ;调用21h断,输出msg4的内容 neg ax ;将ax寄存器的值取反,得到负数 positive: add al, '0' ;将ax寄存器的值转换成字符 mov dl, al ;将字符存入dl寄存器 mov ah, 2 ;设置ah寄存器,表示输出字符 int 21h ;调用21h断,输出dl寄存器的值 mov dl, ah ;将ah寄存器的值存入dl寄存器 mov ah, 2 ;设置ah寄存器,表示输出字符 int 21h ;调用21h断,输出dl寄存器的值 ret ;程序结束,返回操作系统 ``` 上面的代码,我们使用了`cmp`指令和`jge`指令来判断平方差的正负性,如果平方差大于等于0,则直接输出结果;如果平方差小于0,则输出负号,并将平方差取反。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值