检查变量以确定它是所有数字?

时间:2014-04-25 16:00:59

标签: cobol

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

代码:

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.    

3 个答案:

答案 0 :(得分:2)

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

前八个字节有一个数据名。如果您测试的是而不是group-item,那么您的代码将起作用。

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 :(得分:1)

以下代码示例有效并将检查WORK-TRIG1中的每个位置,以查看该值是否为NUMERIC。我测试了它,它确实有效。此示例使用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.                                              

答案 2 :(得分:0)

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

'FALSE99999999' 的值移入 COMP-3 字段并变为 6132599999999,并且程序从未遇到 S0C7 异常终止。

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