【问题标题】:How to remove trailing spaces in COBOL如何删除 COBOL 中的尾随空格
【发布时间】:2018-12-14 14:58:49
【问题描述】:

我有以下代码:

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:

不胜感激。谢谢!

【问题讨论】:

  • @jchevali - 不幸的是,引用的帖子被修改为也删除了嵌入的空格。这不适用于本案。
  • 有些混乱,因为您选择的标题与其他帖子匹配,尽管问题有所不同。您能否将标题更改为如何删除前导和尾随空格。由于 COBOL 标准的变化,还有其他方法可以实现您想要的。具体来说,添加了一个TRIM 函数,并已在一些较新的编译器中实现。识别您正在使用的编译器对您有好处。这样做有助于提供其他解决方案。

标签: cobol


【解决方案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。
  • @SimonSobisch - 我同意TRIM 应该是首选方法,如果有的话;但是,在这种情况下,执行建议的附加 INSPECT 语句时没有嵌入空格。 COBOL 和 only option 很少是正确的!我知道至少有四种方法可以解决这个问题。 OP 使用了INSPECT,使用 OP 已经使用的内容是有意义的。
  • 我同意INSPECT 可以使用,但BEFORE SPACE 是错误的,因为(您自己的注释)对“可能重复”的“可能重复”有嵌入空格的问题(如@ 987654331@ 方法也会有)。具有INSPECT 的解决方案也适用于嵌入式空间,也将使用TRAILING 短语在任何地方都不可用的扩展名。尽管有多个 UNSTRING 或使用FUNCTION REVERSE 中间左/右对齐字段我只知道手动计数方法,请提供更多如果您认为不同的方法有效,请使用方法。
  • @SimonSobisch - 没有嵌入空格,因此,嵌入空格会有问题是一种假设。假设,唯一可能出现空格(或其他非数字)的地方是原始输入数据。在这种情况下,我可能会使用“de-edit”MOVE 来恢复数字,然后在知道没有嵌入空格的情况下继续进行转换。较早的帖子既有字母数字字段,也有数字字段,虽然没有说明,但嵌入的空格可能仅在字母数字字段中,因此不适用于本文中的数字。
【解决方案2】:

执行此操作的简单方法是从字段末尾倒数到第一个非空格字符。

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) ":".

【讨论】:

    【解决方案3】:

    不确定这不适用于所有编译器,但我使用以下构造来删除尾随空格和/或计算字符串长度。这个想法是反转您正在使用的字符串,然后确定前导空格的数量。从字符串的长度中减去该数字。 这也将保留任何嵌入的空间(如果存在)。

    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.
    

    【讨论】:

      【解决方案4】:

      如果您愿意采用不同的方法,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 - 我无意中使用了可能仅适用于 Micro Focus 的扩展程序。
      【解决方案5】:

      安装了带有 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!!!<<
      

      【讨论】:

        猜你喜欢
        • 2021-08-10
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多