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

Cobol 检查一个变量以确保它都是数字?,cobol,Cobol,如何检查工作触发器以确保它都是数字 代码: 工作触发器为-->20140101 CHECK-TRIG. IF WORK-TRIG IS NUMERIC THEN MOVE "FALSE" TO ERR-TRIG ELSE MOVE "TRUE" TO ERR-TRIG END-IF.

如何检查工作触发器以确保它都是数字

代码:

工作触发器为-->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.    

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

  Should Work ALSO:

        IF A IS NUMERIC THEN
           //code here
        END-IF
我确实知道下面的代码是有效的,因为我直接从一个运行良好的程序中获取了它,该程序从88或89年开始运行

代码:

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

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.                                              

问题是WORK-TRIG的长度是80字节。前八个字节包含数据,但整个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的数据名,那么它应该只包含一年。它不应该包含完整的日期。好的数据名称的意义在于,我们人类可以更好地阅读和理解您的代码。在查找问题时,我们发现工作年的长度为8个字节,并且必须花时间确定这是正确的长度,还是正确的名称和错误的长度

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


测试组项的前八个字节有很多模糊的方法,但是由于您已经有了一个名称,希望我们不要修改引用

这看起来不错,假设您希望在值都是数字时显示
FALSE
。使用GNU Cobol,
20140101
显示
FALSE
2014010a
显示
TRUE
用于测试此处的工作触发器定义为PIC X(8)。工作触发器是如何定义的?如果现在可以,Doug,您可以为问题选择Close吗?如果我们能关闭它,我想系统会自动删除它(因为没有答案)。如果仍然存在问题,请使用请求的详细信息更新问题。谢谢。这会影响我的观点吗。我点击了“关闭”,没有一个地方因为回答正确或问题已解决而只能关闭一个问题。不,这不应该影响你的声誉积分。问题并非如“已解决”中所述关闭,而是在无法回答、重复、无法复制、不适合网站、拼写错误等情况下关闭。请阅读帮助中心(顶部栏上的帮助)。不管怎样,现在有了答案。这真的是,真的,可怕的代码。我建议不要复制这样的代码,即使它确实“有效”。请不要
PERFORM
,也不要
PERFORM
超出任何
PERFORM
的范围。这就是我所在公司的许多代码的工作方式。我同意去看电影很糟糕,但你应该看看我们的一些东西。昨天,我看了一本《围棋》杂志,这本书在整个节目中都很受欢迎。我最后不得不把它打印出来,然后你用三支不同颜色的荧光笔找出我要去的地方。听起来很糟糕。彩色记号笔和清单都很好。我会说,继续这样做,直到你能在你的头脑中这样做。用循环来做。这样做会给你打电话的。使用来自文件读取的数据执行此操作。我最初最好的编程工具是铅笔和纸。渐渐地,你可以在头脑中做这件事,但这是一个真正掌握它的好方法。我只是说,不要复制坏代码。“有效”的东西不一定是任何应该公开展示的东西,不管是多么善意。很好地摆脱了去。您应该使用
执行直到…
,如果坚持修改参考,则使用
(SUB1:1)
。目前,您正在测试第一个字节八次,第二个七次,第三个六次,等等。
8
没有描述任何内容。给它起个名字。在循环外将
ERR-TRIG
设置为
FALSE
,这样就不需要其他设置了。要意识到,即使它被整理好了,它也比单一的数值测试更慢、更不清晰。它应该是你的
MyVar(索引:1)
。在现有代码中,放入
DISPLAY“>”工作触发(SUB1:8)
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.