句点是否算作数字(COBOL)

句点是否算作数字(COBOL),cobol,Cobol,我正在家里编写一段代码,假设查找和识别错误是一个输入文件。我做得很对,但有两个小错误在打击我。但主要问题是这一点。我必须编写一个代码,将“3077.B22”标识为错误,因为前5列假定为数字,但我当前的代码允许它通过。但是它会影响到其他任何东西,所以我不得不相信它把周期看作一个小数点。以下是我对这一部分的关注 01 PART-NUMBER-CHECK. 05 P-N-NUM-1 PIC X(5). 05 P-N-LETTER

我正在家里编写一段代码,假设查找和识别错误是一个输入文件。我做得很对,但有两个小错误在打击我。但主要问题是这一点。我必须编写一个代码,将“3077.B22”标识为错误,因为前5列假定为数字,但我当前的代码允许它通过。但是它会影响到其他任何东西,所以我不得不相信它把周期看作一个小数点。以下是我对这一部分的关注

   01  PART-NUMBER-CHECK.
       05 P-N-NUM-1                PIC X(5).
       05 P-N-LETTER               PIC X.
       05 P-N-NUM-2                PIC XX.

   300-VALIDATE-PART-NUMBER.
       MOVE 'NO' TO FIELD-ERROR-SWITCH
       MOVE PART-NUMBER TO PART-NUMBER-CHECK
       EVALUATE P-N-NUM-1
           WHEN 00001 THRU 99999  CONTINUE

           WHEN OTHER              MOVE 'YES' TO FIELD-ERROR-SWITCH
       END-EVALUATE
       IF P-N-LETTER IS NUMERIC
           MOVE 'YES' TO FIELD-ERROR-SWITCH
       END-IF
       IF P-N-LETTER IS ALPHABETIC-LOWER
           MOVE 'YES' TO FIELD-ERROR-SWITCH
       END-IF
       IF P-N-NUM-2 IS ALPHABETIC
           MOVE 'YES' TO FIELD-ERROR-SWITCH
       END-IF
       IF (P-N-NUM-2 > 00 AND < 69)
           OR (P-N-NUM-2 >77 AND < 100)
               CONTINUE
       ELSE
           MOVE 'YES' TO FIELD-ERROR-SWITCH
       END-IF
       IF FIELD-ERROR-SWITCH = 'YES'
           MOVE 'YES' TO RECORD-ERROR-SWITCH
           MOVE 'Part Number' TO FIELD-NAME
           MOVE PART-NUMBER TO FIELD-VALUE
           PERFORM 400-WRITE-DETAIL-LINE
       END-IF.

请帮帮我,我一克服路上的这个小障碍就完成了。

自从我上次编写COBOL以来已经很久了,而且我手头没有编译器,所以希望代码中有一些sintax检查,但你会明白的

01  PART-NUMBER-CHECK.  
   05 P-N-NUM-1                .  
      07 p-x-occ occurs 5      pic X.  
   05 P-N-NUM-1-N    redefines P-N-NUM-1.           .  
      07 p-n-occ occurs 5      pic 9.  
   05 P-N-LETTER               PIC X.  
   05 P-N-NUM-2                PIC XX.  

01 FIELD-ERROR-SWITCH pic x(3).   
   88 no-error value 'NO'.   

300-VALIDATE-PART-NUMBER.
   MOVE 'NO' TO FIELD-ERROR-SWITCH  
   MOVE PART-NUMBER TO PART-NUMBER-CHECK.  
   perform validate-p-n-occurs varying I from 1 to 5.  
   if no-error  
      IF ( P-N-LETTER IS NUMERIC or P-N-LETTER IS ALPHABETIC-LOWER or  
           P-N-NUM-2 IS ALPHABETIC)  
         MOVE 'YES' TO FIELD-ERROR-SWITCH  
      ELSE    
          IF (P-N-NUM-2 < 0) OR (P-N-NUM-20 > 68 AND < 79) OR (P-N-NUM-2 >99)  
             MOVE 'YES' TO FIELD-ERROR-SWITCH  
          END-IF  
      END-IF
   END-IF  

   IF FIELD-ERROR-SWITCH = 'YES'  
       MOVE 'YES' TO RECORD-ERROR-SWITCH  
       MOVE 'Part Number' TO FIELD-NAME  
       MOVE PART-NUMBER TO FIELD-VALUE  
       PERFORM 400-WRITE-DETAIL-LINE  
   END-IF.  

validate-p-n-occurs.  
   IF p-x-occ(I) is not NUMERIC or (p-n-occ(I) < 0 or  > 10)
         MOVE 'YES' TO FIELD-ERROR-SWITCH  
   END-IF.       
01零件号检查。
05 P-N-NUM-1。
07 p-x-occ发生在图5 x。
05 P-N-NUM-1-N重新定义了P-N-NUM-1。
07 p-n-occ发生在图5和图9中。
05 P-N-字母图X。
05 P-N-NUM-2图XX。
01现场错误开关pic x(3)。
88无错误值“否”。
300-验证-零件号。
将“否”移动到字段错误开关
将零件号移动到零件号检查。
执行validate-p-n-I从1到5的变化。
如果没有错误
如果(P-N-字母为数字或P-N-字母为字母或更低)
P-N-NUM-2按字母顺序排列)
将“是”移动到字段错误开关
其他的
如果(P-N-NUM-2<0)或(P-N-NUM-20>68和<79)或(P-N-NUM-2>99)
将“是”移动到字段错误开关
端到端IF
端到端IF
端到端IF
如果FIELD-ERROR-SWITCH='YES'
将“是”移动到记录错误开关
将“零件号”移动到字段名
将零件号移动到字段值
执行400-WRITE-DETAIL-LINE
结束-如果。
验证-p-n-发生。
如果p-x-occ(I)不是数字或(p-n-occ(I)<0或>10)
将“是”移动到字段错误开关
结束-如果。

自从我上次编写COBOL以来,已经有很长一段时间了,而且我手头没有编译器,所以希望代码中有一些sintax检查,但你会明白

01  PART-NUMBER-CHECK.  
   05 P-N-NUM-1                .  
      07 p-x-occ occurs 5      pic X.  
   05 P-N-NUM-1-N    redefines P-N-NUM-1.           .  
      07 p-n-occ occurs 5      pic 9.  
   05 P-N-LETTER               PIC X.  
   05 P-N-NUM-2                PIC XX.  

01 FIELD-ERROR-SWITCH pic x(3).   
   88 no-error value 'NO'.   

300-VALIDATE-PART-NUMBER.
   MOVE 'NO' TO FIELD-ERROR-SWITCH  
   MOVE PART-NUMBER TO PART-NUMBER-CHECK.  
   perform validate-p-n-occurs varying I from 1 to 5.  
   if no-error  
      IF ( P-N-LETTER IS NUMERIC or P-N-LETTER IS ALPHABETIC-LOWER or  
           P-N-NUM-2 IS ALPHABETIC)  
         MOVE 'YES' TO FIELD-ERROR-SWITCH  
      ELSE    
          IF (P-N-NUM-2 < 0) OR (P-N-NUM-20 > 68 AND < 79) OR (P-N-NUM-2 >99)  
             MOVE 'YES' TO FIELD-ERROR-SWITCH  
          END-IF  
      END-IF
   END-IF  

   IF FIELD-ERROR-SWITCH = 'YES'  
       MOVE 'YES' TO RECORD-ERROR-SWITCH  
       MOVE 'Part Number' TO FIELD-NAME  
       MOVE PART-NUMBER TO FIELD-VALUE  
       PERFORM 400-WRITE-DETAIL-LINE  
   END-IF.  

validate-p-n-occurs.  
   IF p-x-occ(I) is not NUMERIC or (p-n-occ(I) < 0 or  > 10)
         MOVE 'YES' TO FIELD-ERROR-SWITCH  
   END-IF.       
01零件号检查。
05 P-N-NUM-1。
07 p-x-occ发生在图5 x。
05 P-N-NUM-1-N重新定义了P-N-NUM-1。
07 p-n-occ发生在图5和图9中。
05 P-N-字母图X。
05 P-N-NUM-2图XX。
01现场错误开关pic x(3)。
88无错误值“否”。
300-验证-零件号。
将“否”移动到字段错误开关
将零件号移动到零件号检查。
执行validate-p-n-I从1到5的变化。
如果没有错误
如果(P-N-字母为数字或P-N-字母为字母或更低)
P-N-NUM-2按字母顺序排列)
将“是”移动到字段错误开关
其他的
如果(P-N-NUM-2<0)或(P-N-NUM-20>68和<79)或(P-N-NUM-2>99)
将“是”移动到字段错误开关
端到端IF
端到端IF
端到端IF
如果FIELD-ERROR-SWITCH='YES'
将“是”移动到记录错误开关
将“零件号”移动到字段名
将零件号移动到字段值
执行400-WRITE-DETAIL-LINE
结束-如果。
验证-p-n-发生。
如果p-x-occ(I)不是数字或(p-n-occ(I)<0或>10)
将“是”移动到字段错误开关
结束-如果。

您的思路是正确的,但是您的编译器支持NumVal函数吗?您可以这样做:

01零件编号9(5)。9(2)

计算零件号=函数NumVal(零件号输入) 例外 将Part Num设置为true无效
End Compute

您的思路正确,但是您的编译器是否支持NumVal函数?您可以这样做:

01零件编号9(5)。9(2)

计算零件号=函数NumVal(零件号输入) 例外 将Part Num设置为true无效
结束计算

给出以下声明:

01  PART-NUMBER-CHECK.
    05 P-N-NUM-1                PIC X(5).
    05 P-N-LETTER               PIC X.
    05 P-N-NUM-2                PIC XX.
比如:

   MOVE 'NO' TO FIELD-ERROR-SWITCH
   MOVE '3077.B22' TO PART-NUMBER-CHECK
   EVALUATE P-N-NUM-1
       WHEN 00001 THRU 99999  CONTINUE
       WHEN OTHER              MOVE 'YES' TO FIELD-ERROR-SWITCH
   END-EVALUATE
为什么
FIELD-ERROR-SWITCH
没有设置为“是”?COBOL铸型 在应用之前,将00001和99999转换为其
PIC X
等效项 这里的射程测试(施法规则)相当复杂,所以我不打算 进入它)。COBOL在这里执行的实际测试 大致相当于以下内容:

IF '00001' <= '3077.' AND '99999' >= '3077.'
然后编码如下:

 MOVE SOME-CHAR TO TEST-CHAR
 EVALUATE TRUE
     WHEN IS-DIGIT
         DISPLAY 'IS A DIGIT'
     WHEN IS-LOWER-LETTER OR IS-UPPER-LETTER
         DISPLAY 'IS ALPHA'
     WHEN IS-SPACE
         DISPLAY 'IS A SPACE'
     WHEN OTHER
         DISPLAY 'IS A SOMETHING ELSE'
 END-EVALUATE
它几乎是防弹的。 为什么我要把字母表分成不同的组?查看EBCDIC 整理序列,你会发现一些非字母字符潜入 在‘i’和‘j’之间,然后再在‘r’和‘s’之间!哦,我多么喜欢EBCDIC

如何解决你的问题?简单到:

IF P-N-NUM-1 IS NUMERIC
   IF P-N-NUM-1 = ZERO
      MOVE 'YES' TO FIELD-ERROR-SWITCH
   END-IF
ELSE       
   MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
我会成功的。
NUMERIC
测试确保组成
P-N-NUM-1
只有数字。
ZERO
测试确保它不是零。在这种情况下是负数 在
数值测试中排除。当
正在测试的项目声明为
PIC X
PIC 9
。如果将基本项声明为
PIC S9(5)压缩十进制
,则前导符号将通过
数字
测试。COBOL
NUMERIC
类测试需要一点学习才能完全理解

大提示:确保存储本应为数字的内容 在声明为数字的基本项中。我会尝试声明
P-N-NUM-1
P-N-NUM-2
使用
pic9
。将未验证的数据移动到
零件号检查中
,默认情况下 是
picx
,因此不会发生错误,然后使用
如果是数字
测试。一旦你知道你有数字数据,然后你的范围测试(例如
00001到99999
, 大于/小于)不会让你误入歧途-就像这里发生的那样

为什么“*”会在你的第二段代码中偷偷出现?您从未在非字母字符上设置错误, 只在数字上。为什么?
IF P-N-NUM-1 IS NUMERIC
   IF P-N-NUM-1 = ZERO
      MOVE 'YES' TO FIELD-ERROR-SWITCH
   END-IF
ELSE       
   MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF