如何删除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中使用的扩展。