由于您似乎担心审阅者可能会说什么,所以这里的代码实际上可以满足您的要求:
UNSTRING edited-field
DELIMITED BY ALL SPACE
INTO ignore-this
no-leading-space-field
我完全不确定这会有多困难。它确实需要这些定义:
01 edited-field PIC Z(10).99.
01 no-leading-space-field PIC x(13).
01 ignore-this PIC X.
如果您谈论的是性能优化,那么您需要处理 gazzz0x2z 在他们的答案中提供的代码。但是你的审阅者会再次对多行代码感到困惑。
COBOL 动词 STRING 和 UNSTRING 自 1974 年 COBOL 标准以来一直存在,因此应该可以广泛使用。对于常规文本的操作,它们有很多用途。
IDENTIFICATION DIVISION.
PROGRAM-ID. supspace.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 unedited-field PIC 9(9)v99.
01 edited-field PIC Z(10).99.
01 no-leading-space-field PIC x(13).
01 output-text PIC x(80).
01 text-intro PIC x(13) VALUE
"LOAN AMOUNT $".
01 text-outro PIC x(12) VALUE
" TO PAY SOON".
01 ignore-this PIC X.
PROCEDURE DIVISION.
MOVE 0.01 TO unedited-field
PERFORM the-work
MOVE 123.01 TO unedited-field
PERFORM the-work
MOVE ZERO TO unedited-field
PERFORM the-work
MOVE 123456789.01 TO unedited-field
PERFORM the-work
GOBACK
.
the-work.
PERFORM left-justify-edit
PERFORM assemble-output
DISPLAY
output-text
.
left-justify-edit.
MOVE unedited-field TO edited-field
UNSTRING edited-field
DELIMITED BY ALL SPACE
INTO ignore-this
no-leading-space-field
.
assemble-output.
MOVE SPACE TO output-text
STRING
text-intro
DELIMITED BY SIZE
no-leading-space-field
DELIMITED BY SPACE
text-outro
DELIMITED BY SIZE
INTO output-text
.
输出是:
LOAN AMOUNT $.01 TO PAY SOON
LOAN AMOUNT $123.01 TO PAY SOON
LOAN AMOUNT $.00 TO PAY SOON
LOAN AMOUNT $123456789.01 TO PAY SOON
请注意,edited-field 的定义比其他必要的长一个字节,Z(10) 而不是 Z(9)。这是为了确保 UNSTRING 的 DELIMITED 始终至少有一个前导空格。
注意当结果值小于目标的大小时,STRING 不会对其目标字段进行空格填充,因此如果结果值的长度可变,请在此之前清除目标字段使用 STRING 动词。
UNSTRING 使用指定的分隔符将单个字段拆分为多个字段。
其工作原理的关键是字段 ignore-this 和 DELIMITED BY ALL SPACE,以及保证至少存在一个前导空格。
ALL SPACE 是任意数量的空格,从 1 到它所应用的字段的大小。在 UNSTRING 中命名的任何分隔符都不包含在 INTO 字段中。前导分隔符的存在意味着第一个 INTO 字段将“包含”一段长度为零的数据,空格填充到第一个 INTO 字段的长度。第二个 INTO 字段将包含没有前导空格的数据,并将用空格填充到该字段的长度。
STRING 取多个字段,可以由其中的数据分隔,并将它们放在一起形成一个数据,放在 INTO 字段中,必要时截断,但没有空格- 如果数据比 INTO 字段短,则填充。
在此处使用的 STRING 中,只有 SPACE 是分隔符,而不是 ALL SPACE,因为单个空格足以分隔,并且代码将比使用 ALL SPACE 更快。