检查变量以确保它都是数字?

问题描述 投票:0回答:4

如何检查 Work-Trig 以确保它都是数字?

代码:

工作触发是 --> 20140101

CHECK-TRIG.                          
    IF WORK-TRIG IS NUMERIC THEN     
       MOVE "FALSE" TO ERR-TRIG      
    ELSE                             
       MOVE "TRUE" TO ERR-TRIG       
    END-IF.                          
    DISPLAY 'ERR-TRIG' ERR-TRIG.     
X-CHECK. EXIT.  

01  WORK-TRIG.                               
 05 TRIG-YEAR  PIC X(08) VALUE SPACES.    
 05 TRIG-MONTH PIC X(01) VALUE SPACES.    
 05 TRIG-DAY   PIC X(01) VALUE SPACES.    
 05 FILLER     PIC X(70) VALUE SPACES.    
cobol
4个回答
2
投票

问题是 WORK-TRIG 的长度是 80 个字节。前 8 个字节包含您的数据,但整个 80 个字节将被测试为数字。

您有前八个字节的数据名称。如果您测试它而不是组项,您的代码将会工作。

CHECK-TRIG.                          
    IF WORK-YEAR IS NUMERIC THEN     
       MOVE "FALSE" TO ERR-TRIG      
    ELSE                             
       MOVE "TRUE" TO ERR-TRIG       
    END-IF.                          
    DISPLAY 'ERR-YEAR' ERR-TRIG.     
X-CHECK. EXIT. 

如果您有一个名为 WORK-YEAR 的数据名称,它应该只包含年份。它不应包含完整的日期。数据的好名称的目的是让我们人类能够更好地阅读和理解您的代码。在查找问题时,我们发现 WORK-YEAR 有 8 个字节长,并且必须花时间找出它是否是正确的长度,或者正确的名称和错误的长度。

考虑到代码更改,最好也为 ERR-TRIG 使用不同的名称。

还有更晦涩的方法来测试组项目的前八个字节,但由于您已经有了一个名称,因此希望我们能够将引用修改排除在外。


1
投票

以下代码示例有效,并将检查 WORK-TRIG1 中的每个位置以查看该值是否为数字。我对此进行了测试,它确实有效。此示例使用 PERFORM VARYING 循环对字符串中的每个“位置”进行索引以查看其是否有效。

  Should Work ALSO:

        IF A IS NUMERIC THEN
           //code here
        END-IF

我确实知道下面的代码可以工作,因为我直接从一个运行完美且自 88 或 89 开始的程序中获取了它。

代码:

CHECK-TRIG.                                                          
    PERFORM VARYING SUB1 FROM 1 BY 1 UNTIL SUB1 > 8                  
      IF WORK-TRIG(1:SUB1) IS NUMERIC THEN                           
         MOVE 'FALSE' TO ERR-TRIG                                    
      ELSE                                                           
         MOVE 'TRUE' TO ERR-TRIG                                     
         MOVE SUB1   TO SV-RTN-CODE 
         MOVE 9 TO SUB1                                 
      END-IF                                                         
    END-PERFORM.                                                     
X-CHECK. EXIT.        

--代码--新的,这不起作用

PERFORM VARYING SUB1 FROM 1 BY 1 UNTIL SUB1 > 8          
  IF WORK-TRIG(SUB1:8) IS NUMERIC THEN                   
     MOVE 'FALSE' TO ERR-TRIG                            
  ELSE                                                   
     MOVE 'TRUE' TO ERR-TRIG                             
     MOVE SUB1   TO SV-RTN-CODE                          
     MOVE '   TRIGGER CARD ERROR (SEE DATE BELOW)' TO    
          ERR-DET                                        
     MOVE 9 TO SUB1                                      
  END-IF                                                 
END-PERFORM.                                              

0
投票

最近经历过将非数字成功处理为数字(COMP-3)字段。

“FALSE99999999”的值移至 COMP-3 字段并变为 6132599999999,并且程序从未遇到 S0C7 ABEND。

看起来验证源字段的每个字节是识别此类问题的唯一方法。


0
投票

我认为这有效吗? 由于某种原因,如果 VARIABLE = SPACES,它被视为数字。

IF FUNCTION TRIM(VARIABLE) IS NOT = SPACES AND 
   FUNCTION TRIM(VARIABLE) IS NUMERIC      THEN
   DISPLAY 'NUMERIC'
   DISPLAY FUNCTION TRIM(VARIABLE)
ELSE
   DISPLAY 'NOT NUMERIC'
   DISPLAY FUNCTION TRIM(VARIABLE)
END-IF
© www.soinside.com 2019 - 2024. All rights reserved.