如何删除COBOL中的尾随空格
我有以下代码:如何删除COBOL中的尾随空格,cobol,Cobol,我有以下代码: 01 W-IX1 PIC 9(8) VALUE ZERO COMP-4. 01 W-INPUT-AMNT PIC 9(9)V9(5). 01 W-ROUNDED-AMNT PIC Z(9). 01 W-TEMP-AMNT PIC X(9). 01 W-OUTPUT-AMNT PIC X(9)
01 W-IX1 PIC 9(8) VALUE ZERO COMP-4.
01 W-INPUT-AMNT PIC 9(9)V9(5).
01 W-ROUNDED-AMNT PIC Z(9).
01 W-TEMP-AMNT PIC X(9).
01 W-OUTPUT-AMNT PIC X(9).
MOVE 123.92345 TO W-INPUT-AMNT.
MOVE 1 TO W-IX1.
COMPUTE W-ROUNDED-AMNT ROUNDED = W-INPUT-AMNT * 1.
MOVE W-ROUNDED-AMNT TO W-TEMP-AMNT.
INSPECT W-TEMP-AMNT TALLYING W-IX1 FOR LEADING SPACES.
MOVE W-TEMP-AMNT(W-IX1:) TO W-OUTPUT-AMNT.
DISPLAY "RESULT:" W-OUTPUT-AMNT ":".
MOVE SPACE TO W-OUTPUT-AMNT.
以及以下输出:
RESULT:124 :
RESULT:124:
我的目的是接收以下输出:
RESULT:124 :
RESULT:124:
非常感谢您的帮助。谢谢 添加另一个
INSPECT
,以及一些其他更改,应该是所有必要的
01 W-IX2 PIC 9(8) VALUE ZERO COMP-4.
MOVE 0 TO W-IX2
INSPECT W-OUTPUT-AMNT TALLYING
W-IX2 FOR CHARACTERS BEFORE SPACE.
DISPLAY "RESULT:" W-OUTPUT-AMNT(1:W-IX2) ":".
输出:
RESULT:124:
RESULT:124:
实现这一点的简单方法是从字段末尾向后计数到第一个非空格字符
Preform varying NDX from length of W-OUTPUT-AMT by -1
until W-OUTPUT-AMT (NDX:1) <> SPACE
DISPLAY "RESULT:" W-OUTPUT-AMNT (1:NDX) ":".
预成型件将NDX从W-OUTPUT-AMT的长度变为-1
直到W-OUTPUT-AMT(NDX:1)空间
显示“结果:W-OUTPUT-AMNT(1:NDX)”:”。
如果您对不同的方法持开放态度,则解压
语句可能会消除前导空格,使尾随空格不相关,并方便地保存数字及其长度
请注意,W-ROUNDED-AMNT
已更改,以确保一个前导空格和至少一个数字
WORKING-STORAGE SECTION.
01 W-IX1 PIC 9(8) VALUE ZERO COMP-4.
01 W-INPUT-AMNT PIC 9(9)V9(5).
01 W-ROUNDED-AMNT-X.
03 W-ROUNDED-AMNT PIC Z(9)9.
01 W-X PIC X.
01 W-OUTPUT-AMNT PIC X(9).
PROCEDURE DIVISION.
MOVE 123.92345 TO W-INPUT-AMNT.
COMPUTE W-ROUNDED-AMNT ROUNDED = W-INPUT-AMNT.
UNSTRING W-ROUNDED-AMNT-X DELIMITED ALL SPACE
INTO W-X W-OUTPUT-AMNT COUNT W-IX1
DISPLAY "RESULT:" W-OUTPUT-AMNT(1:W-IX1) ":".
MOVE SPACE TO W-OUTPUT-AMNT.
STOP RUN.
输出:
RESULT:124:
RESULT:124:
我不确定这不会在所有编译器上都起作用,但我使用以下构造来删除尾随空格和/或计算字符串长度。其思想是反转正在使用的字符串,然后确定前导空格的数量。从字符串的长度中减去该数字。 这也将保留任何嵌入的空间(如果存在)
WORKING-STORAGE SECTION.
01 W-IX1 PIC 9(8) VALUE ZERO COMP-4.
01 W-TRAIL PIC 9(8) VALUE ZERO COMP-4.
01 W-LENGTH PIC 9(8) VALUE ZERO COMP-4.
01 W-INPUT-AMNT PIC 9(9)V9(5).
01 W-ROUNDED-AMNT PIC Z(9).
01 W-TEMP-AMNT PIC X(9).
01 W-OUTPUT-AMNT PIC X(9).
PROCEDURE DIVISION.
MOVE 123.92345 TO W-INPUT-AMNT.
MOVE 1 TO W-IX1.
COMPUTE W-ROUNDED-AMNT ROUNDED = W-INPUT-AMNT * 1.
MOVE W-ROUNDED-AMNT TO W-TEMP-AMNT.
INSPECT W-TEMP-AMNT TALLYING W-IX1 FOR LEADING SPACES.
MOVE W-TEMP-AMNT(W-IX1:) TO W-OUTPUT-AMNT.
MOVE ZERO TO W-TRAIL.
INSPECT FUNCTION REVERSE (W-OUTPUT-AMNT)
TALLYING W-TRAIL
FOR LEADING SPACE.
SUBTRACT W-TRAIL
FROM LENGTH OF W-OUTPUT-AMNT
GIVING W-LENGTH.
DISPLAY "RESULT:" W-OUTPUT-AMNT(1:W-LENGTH) ":".
MOVE SPACE TO W-OUTPUT-AMNT.
STOP RUN.
安装了APAR PI99703的Enterprise COBOL V6R2。您可以使用TRIM内在函数
Identification division.
Program-id. TESTTRIM.
Data division.
Working-storage section.
1 msg pic x(20) value "Hello, World!!! ".
Procedure division.
Display ">>" msg "<<"
Display ">>" function trim(msg) "<<"
Goback.
识别部门。
Program-id.TESTTRIM。
数据司。
工作储存区。
1 msg pic x(20)值“你好,世界!!!”。
程序司。
显示“>>“msg”功能微调(msg)“请检查:@jchevali-不幸的是,引用的帖子被修改为也删除了嵌入的空格。这不适用于这种情况。可能的重复存在一些混乱,因为您选择的标题与其他帖子匹配,尽管问题不同。请将标题改为“如何删除前导空格和尾随空格”。由于COBOL标准的变化,还有其他方法可以实现您想要的。具体来说,添加了TRIM
函数,并在一些较新的编译器中实现了该函数。识别您正在使用的编译器对您有好处。这样做有助于提供其他解决方案。这也将取代嵌入式空间。没有修剪的唯一选项是。。。严格按照函数TRIM
的定义执行:从第一个位置开始,直到找到一个非空格,然后从最后一个位置开始,直到找到非空格,计算大小并执行ref mod。@SimonSobisch-我同意TRIM
应该是首选方法(如果可用);但是,在这种情况下,当执行建议的附加INSPECT
语句时,没有嵌入空格。COBOL和only选项很少是正确的!我知道至少有四种方法可以解决这个问题。OP使用了INSPECT
,使用OP已经使用过的内容是有意义的。我同意可以使用INSPECT
,但是在空格之前
是错误的,因为(你自己的注释)对于“可能的重复”它会有嵌入空格的问题(因为取消排列
的方法也会有)。带有INSPECT
的解决方案也适用于嵌入式空间,它还将使用一个扩展名,该扩展名在后面的短语中到处都不可用。尽管存在多个解列
或使用函数反转
或中间左/右对齐字段,但我只知道手动计数方法,如果您认为其他方法有效,请提供更多方法。@SimonSobisch-没有嵌入空格,因此,这将有一个问题,嵌入式空间是一个假设。假设,唯一可能出现空格(或其他非数字)的地方是原始输入数据。在这种情况下,我可能会使用“去编辑”MOVE
来恢复数字,然后在知道没有嵌入空格的情况下继续转换。以前的帖子既有字母数字字段也有数字字段,虽然没有说明,但嵌入的空格可能只在字母数字字段中,因此不适用于本帖中的数字。Intrest方法。在这种情况下收到编译器错误:标识符“W-ROUNDED-AMNT(NUMERIC-EDITED)”既不是字母数字、DBCS、字母数字或国家函数。该语句已被丢弃。@reto-我无意中使用了一个只能在Micro Focus中使用的扩展。