如何在COBOL中去除末尾空格

3

I have following code:

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:

希望能获得任何帮助。谢谢!


请查看此链接:https://dev59.com/ZJXfa4cB1Zd3GeqPckim#36137284 - jchevali
@jchevali - 不幸的是,引用的帖子也被修改以删除嵌入的空格。这不适用于此情况。 - Rick Smith
可能是重复的问题:如何去除字符串中的尾随空格? - jchevali
2
由于您选择的标题与其他帖子相匹配,因此可能会导致混淆,尽管问题不同。您能否将标题更改为“如何删除前导和尾随空格”?由于COBOL标准的更改,有其他方法可以实现您想要的功能。具体来说,一个名为TRIM的函数已被添加并在一些更新的编译器中实现了。如果您能确定您正在使用的编译器,那将非常有帮助,因为这样可以提供其他解决方案。 - Rick Smith
5个回答

1
从字段末尾向第一个非空格字符倒数计数是一种简单的方法。
Preform varying NDX from length of W-OUTPUT-AMT by -1
  until W-OUTPUT-AMT (NDX:1) <> SPACE
     or NDX = 1

DISPLAY "RESULT:" W-OUTPUT-AMNT (1:NDX) ":".

1

只需要添加另一个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:

这也将替换嵌入的空格。如果没有 TRIM 的唯一选择是...做完全符合函数 TRIM 定义的事情: 从第一个位置开始,直到找到不是空格为止,然后从最后一个位置开始,直到找到非空格为止,计算大小并进行 ref-mod。 - Simon Sobisch
1
@SimonSobisch - 我同意如果有的话,TRIM 应该是首选的方法;但在这种情况下,当执行建议的额外 INSPECT 语句时,并没有嵌入空格。COBOL 和“唯一选项”很少是正确的!我知道至少有四种解决这个问题的方法。鉴于 OP 已经使用了 INSPECT,跟随 OP 已经使用的方法是有道理的。 - Rick Smith
我同意可以使用INSPECT,但是BEFORE SPACE会有问题,因为根据“可能重复”的注释,它会在嵌入空格的情况下出现问题(与UNSTRING方法一样)。 使用INSPECT解决嵌入空格的问题,也需要使用不是所有地方都可用的TRAILING扩展。 尽管使用多个 UNSTRING或使用FUNCTION REVERSE 中间的左/右对齐字段,但我只知道手动计数的方法,请提供更多方法,如果您认为其他方法可行。 - Simon Sobisch
@SimonSobisch - 没有嵌入空格,因此,“它将在嵌入空格时出现问题”是一种假设。假设,唯一可能出现空格(或其他非数字字符)的地方是原始输入数据。在这种情况下,我可以使用“de-edit” MOVE 来恢复数字,然后继续进行转换,知道没有嵌入空格。早期的帖子中有字母数字和数字字段,虽然没有说明,但嵌入的空格可能仅存在于字母数字字段中,因此不适用于本帖中的数字。 - Rick Smith

0

如果您愿意尝试不同的方法,UNSTRING语句可以消除前导空格,使尾随空格无关紧要,并方便地保存数字及其长度。

请注意,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:

有趣的方法。在这种情况下收到编译器错误:标识符“W-ROUNDED-AMNT(NUMERIC-EDITED)”既不是字母数字,也不是DBCS,字母数字或国家功能。该语句被丢弃了。 - reto
@reto - 我不小心使用了一个可能只在Micro Focus上可用的扩展。 - Rick Smith

0

不确定这种方法是否适用于所有编译器,但我使用以下结构来删除尾随空格和/或计算字符串长度。思路是反转你正在处理的字符串,然后确定前导空格的数量。从字符串长度中减去该数字。 如果存在任何嵌入式空格,则这也将保留它们。

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.

0

如果您安装了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.

输出将会是:

>>Hello, World!!!     <<
>>Hello, World!!!<<

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接