如何在COBOL程序中删除数值变量的前导零?
COBOL中删除数值变量的前导零
问题分析
你当前代码的核心问题是:把数值型变量VN-NUM(PIC 9(5))移到字符型VA-STNUM后,变量里存的是前导零而非空格,但你的INSPECT语句在统计前导空格,所以VN-NUM-OF-SPACES始终为0,后续的截取逻辑自然失效。
解决方案
下面提供几种实用的实现方式:
方法1:修改原代码,统计前导零并截取
调整逻辑,把统计前导空格改为统计前导零,同时处理全零的边界情况:
IDENTIFICATION DIVISION. PROGRAM-ID. REMOVE-LEADING-ZEROS. AUTHOR. TZS. DATA DIVISION. WORKING-STORAGE SECTION. 01 VN-NUM PIC 9(5). 01 VA-STNUM PIC X(5). 01 VN-LEADING-ZEROS PIC 9(1) VALUE 0. 01 VA-RESULT PIC X(5). 01 VN-ACTUAL-LENGTH PIC 9(1). PROCEDURE DIVISION. DISPLAY 'ENTER A NUMBER UP TO 5 DIGIT:'. ACCEPT VN-NUM. MOVE VN-NUM TO VA-STNUM. *> 统计前导零的数量 INSPECT VA-STNUM TALLYING VN-LEADING-ZEROS FOR LEADING '0'. *> 处理全零或正常截取 IF VN-LEADING-ZEROS = 5 MOVE '0' TO VA-RESULT ELSE COMPUTE VN-ACTUAL-LENGTH = 5 - VN-LEADING-ZEROS MOVE VA-STNUM(VN-LEADING-ZEROS + 1 : VN-ACTUAL-LENGTH) TO VA-RESULT END-IF. DISPLAY '原始值: ' VA-STNUM. DISPLAY '去除前导零后: ' VA-RESULT. STOP RUN.
方法2:使用COBOL内置函数简化操作
如果你的COBOL版本支持COBOL 2008及以上标准,可以直接用NUMVAL-CONVERT函数一步完成:
IDENTIFICATION DIVISION. PROGRAM-ID. REMOVE-LEADING-ZEROS-FUNC. AUTHOR. TZS. DATA DIVISION. WORKING-STORAGE SECTION. 01 VN-NUM PIC 9(5). 01 VA-RESULT PIC X(5). PROCEDURE DIVISION. DISPLAY 'ENTER A NUMBER UP TO 5 DIGIT:'. ACCEPT VN-NUM. *> 自动将数值转为无前置零的字符串 MOVE FUNCTION NUMVAL-CONVERT(VN-NUM) TO VA-RESULT. DISPLAY '原始值: ' VN-NUM. DISPLAY '去除前导零后: ' VA-RESULT. STOP RUN.
注:输入全零时,函数会返回单个'0',符合预期。
方法3:遍历拼接有效数字
通过循环遍历字符变量,跳过前导零后拼接有效部分:
IDENTIFICATION DIVISION. PROGRAM-ID. REMOVE-LEADING-ZEROS-STRING. AUTHOR. TZS. DATA DIVISION. WORKING-STORAGE SECTION. 01 VN-NUM PIC 9(5). 01 VA-STNUM PIC X(5). 01 VA-RESULT PIC X(5) VALUE SPACES. 01 I PIC 9(1) VALUE 1. 01 FIRST-NON-ZERO PIC X(1) VALUE 'N'. PROCEDURE DIVISION. DISPLAY 'ENTER A NUMBER UP TO 5 DIGIT:'. ACCEPT VN-NUM. MOVE VN-NUM TO VA-STNUM. PERFORM UNTIL I > 5 IF FIRST-NON-ZERO = 'N' AND VA-STNUM(I:1) = '0' CONTINUE ELSE MOVE 'Y' TO FIRST-NON-ZERO STRING VA-STNUM(I:1) DELIMITED BY SIZE INTO VA-RESULT DELIMITED BY SIZE END-IF ADD 1 TO I END-PERFORM. *> 处理全零导致结果为空的情况 IF VA-RESULT = SPACES MOVE '0' TO VA-RESULT END-IF. DISPLAY '原始值: ' VA-STNUM. DISPLAY '去除前导零后: ' VA-RESULT. STOP RUN.
关键注意点
- 数值型变量(PIC 9(n))本身存储时就带有前导零,必须先转换为字符型变量才能处理前导零
- 必须考虑输入全为零的边界场景,避免最终结果为空
内容的提问来源于stack exchange,提问作者tzipi2003
相关产品推荐
相关产品推荐

