COBOL字符串的操作
(—)字符串的合并STRING 一、 STRING 语句的基本用法 DATA DIVISION
WORKING-STORAGE SECTION. 01 FIRST-NAME PIC X(10). 01 LAST-NAME PIC X(10). 01 FULL-NAME PIC X(20). PROCEDURE DIVISION.
MOVE 'ADAM' TO FIRST-NAME. MOVE 'SMITH' TO LAST-NAME. STRING
FIRST-NAME DELMITED BY SPACE ' ' DELIMITED BY SIZE
LAST-NAME DELIMITED BY SPACE INTO FULL-NAME.
DISPLAY 'FIRST NAME :',FIRST-NAME. DISPLAY 'LAST NAME :',LAST-NAME. DISPLAY 'FULL NAME :',FULL-NAME. STOP RUN.
输出结果:
FIRST NAME :ADAM LAST NAME :SMITH
FULL NAME :ADAM SMITH
以上为STRING 语句的基本格式。其中每项用于合并的字符串后面都要加上DELIMITED BY 语句。DELIMITED BY 子句后面有两个选项,分别为SPACE和SIZE。
SPACE:找到前面用于合并的字符串中第一个出现空格的地方。将该空格以前的部分进行合并,空格以后的内容包括该空格在内不参与合并操作。
SIZE:将前面对应的用于合并的字符串中的全部内容进行合并。另外BY 后可以接一个变量名称,并且将该变量中保存的字符作为原字符串的截取符。截取符的用法同SPACE选项类似。
(三)字符串的替换INSPECT语句
INSPECT语句主要用于对字符串中的指定部分进行替换。字符串的替换和转换是不同的。字符串替换是将原字符串中的部分字符替换成其他字符。转换时保持原字符串的字符不变,只对其格式进行转换。 1.对全体字符进行替换
该项功能是通过在INSPECT语句中加上“ALL”选项实现的。下面这段代码将原字符中
所有字符“A”替为“B”,并且将所有的0替换为中划线。 DATA DIVISION.
WORKING-STORAGE SECTION. 01 TEST-STRING PIC X(10). *
PROCEDURE DIVISION.
MOVE 'ADCD0A0A8B' TO TEST-STRING. DISPLAY 'BEFORE INSPECT :',TEST-STRING. INSPECT SOURCE-STRING
REPLACING ALL 'A' BY 'B'. INSPECT SOURCE-STRING
REPLACING ALL 0 BY '-'.
DISPLAY 'AFTER INSPECT :',TEST-STRING. STOP RUN.
该段代码执行后,将有如下输出信息。 BEFORE INSPECT : ADCD0A08B AFTER INSPECT : BDCD-B-8B
这种替换方式是对字符串中满足条件的全体字符进行的替换。并且替换后生成的新字符串覆盖了以前的符串。 2.对前缀字符进行替换
这种替换方式是对字符串前面连续出现的一段字符进行替换,即对前缀字符进行的替换。 该项功能是通过在INSPECT 语句中加上'LEADING'选项实现的。 下面代码对一段表示数字的字符串进行了替换。替换方式为将原字符串中的前缀0替换成前缀星号‘*’,以进 行适当的输出。 DATA DIVISION.
WORKING-STORAGE SECTION. 01 TEST-STRING PIC X(10). *
PROCEDURE DIVISION.
MOVE '0000567.90' TO TEST-STRING. DISPLAY 'BEFORE INSPECT :',TEST-STRING. INSPECT TEST-STRING
REPLACING LEADING 0 BY '*'.
DISPLAY 'AFTER INSPECT :',TEST-STRING. STOP RUN.
该代码执行后,将有如下输出信息。 BEFORE INSPECT :0000567.90 AFTER INSPECT :****567.90
通过以上代码可以发现,使用LEADING选项只是对前缀字符进行了替换。这里的前缀字符是从字符串开头处连续出现的一串字符。因此,即使原字符串中在最后还有一个字符0,也并不对其进行替换。
另外INSPECT语句还可以统计并保存前缀字符出现的次数。该项功能是通过结合
TALLYING.... FOR LEADING...实现的。其中前面一个省略号表示用以保存前缀字符出现次数的变量名。后一个省略号表示该前缀字符。以下代码统计并输出了字符串中前缀字符出现的次数。 ...
DATA DIVISION.
WORKING-STORAGE SECTION. 01 TEST-STRING PIC X(10).
01 COUNT PIC 9 VALUE ZERO. PROCEDURE DIVISION.
MOVE '0000567.90' TO TEST-STRING. DISPLAY 'SOURCE STRING:', TEST-STRING. INSPECT TEST-STRING
TALLYING COUNT FOR LEADING '0'. DISPLAY 'HOW MANY LEADING 0:',COUNT. STOP RUN.
该代码执行后,将有如下输出信息。 SOURCE STRING :0000567.90 HOW MANY LEADING 0:4 3.对首字符进行替换
只对字符串中的第一个字符进行替换。
该项功能是通过在INSPECT 语句中加上'FIRST'选项实现的。 下面代码将前缀为星号的字符串首字符替换为美元符号‘$’。 ....
DATA DIVISION.
WORKING-STORAGE SECTION. 01 TEST-STRING PIC X(10). *
PROCEDURE DIVISION.
MOVE '0000567.90' TO TEST-STRING. DISPLAY 'SOURCE DATA :',TEST-STRING. INSPECT TEST-STRING
REPLACING LEADING 0 BY '*'.
DISPLAY 'CONVERTED DATA-1:',TEST-STRING. INSPECT TEST-STRING
REPLACING FIRST '*' TO '$'.
DISPLAY 'CONVERTED DATA-2:',TEST-STRING. STOP RUN.
该段代码执行后,将有如下输出信息。 SOURCE DATA: 0000567.90
CONVERTED DATA-1:****567.90 CONVERTED DATA-2:$***567.90
以上程序首先将前缀字符进行转换,之后再此基础上再对首字符进行转换。通过两次转换,最终将原始数据0000567.90转换成了标准输出格式$***567.90
(四)-字符串的转换FUNCTION语句
字符串的转换是以原字符串的字符为基础进行的格式上的转换,并不对原字符进行替换。主要有两种转换方式:
一种是对于由字母组成的字符串中字母大小写的转换方式; 另一种是将由数字组成的字符串转换为具体数值。 1.FUNCTION 语句实现字符串中字母大小写的转换。
其关键之处是在该语句后加上LOWER-CASE,或者UPPER-CASE选项。
下面的代码使用LOWER-CASE选项,将字符串中的字母全部转换为小写格式。 DATA DIVISION.
WORKING-STORAGE SECTION. 01 SOURCE-STR PIC X(5). 01 NEW-STR PIC X(5). *
PROCEDURE DIVISION.
MOVE 'AB-CDE' TO SOURCE-ATR. DISPLAY SOURCE-STR.
DISPLAY FUNCTION LOWER-CASE(SOURCE-STR). MOVE 'Ab-Cde' TO SOURCE-STR. DISPLAY SOURCE-STR.
DISPLAY FUNCTION LOWER-CASE(SOURCE-STR).
MOVE FUNCTION LOWER-CASE(SOURCE-STR) TO NEW-STR. DISPLAY NEW-STR. DISPLAY SOURCE-STR. STOP RUN.
执行后为: AB-CDE ab-cde Ab-Cde ab-cde Ab-Cde
LOWER-CASE 只将字符串中的大写字母转换为对应的小写形式。对于字符串中原本为小写的字母字符,以及其他字符不做处理
LOWER-CASE 只是临时对其进行转换,转换后的结果只在该条语句有效。即LOWER-CASE并不将转换结果保存到原字符串中。若要保存转换后的字符串,通常使用MOVE 语句将其保存到一个新的字符串变量中。
与LOWER-CASE对应,UPPER-CASE是将字符串中的字母转换为对应的大写形式。 2.将字符串转换为具体数值
将字符串转换为具体数值将是字符串转换中用处很大的一种转换方式。转换成具体数值后,该数值同其他普通字符一样,可以参与算术运算了。同时,当需要从键盘输入相应数值时,也更加方面一些。
此处是通过在FUNCTION语句后面加上NUMVAL或者NUMVAL-C实现的。
下面使用NUMVAL的用法。 ....
DATA DIVISION.
WORKING-STORAGE SECTION. 01 SOURCE-STR-1 PIC X(10). 01 SOURCE-STR-2 PIC X(10). 01 RESULT PIC S99V99. 01 RESULT-DPL PIC $$$.99. *
PROCEDURE DIVISION.
MOVE '-10.50' TO SOURCE-STR-1. MOVE '12.80' TO SOURCE-STR-2. COMPUTE RESULT =
FUNCTION NUMVAL(SOURCE-STR-1) + FUNCTION NUMVAL(SOURCE-STR-2). MOVE RESULT TO RESULT-DPL. DISPLAY 'RESULT :',RESULT-DPL. STOP RUN. 输出结果是: RESULT :$2.30
FUNCTION NUMVAL 语句将以上两个变量中的字符串转换成具体数值。并将这两个具体数值相加后将结果存入RESULT变量中。RESULT 变量被定义为一个Signed Numbers符号类型数据,保存的是具体数值。
程序最后将RESULT变量中的具体数值MOVE到RESULT-DPL变量中以用于输出。RESULT-DPL变量被定义为一个Numeric Edited Fields格式输出类型。因此,这里相当于又将具体数值转换回成了字符串。
NUMVAL-C相当于是NUMVAL的扩展。当原始字符串出现以下情况时,必须使用NUMVAL-C选项。
原始字符串中有货币流通符号$。 原始字符串中有分隔符逗号。 另外,无论NUMVAL还是NUMVAL-C都允许原字符串中出现正负号。并且,转换后的实际是指遵循原字符串中所指定的正负性。
当需要从键盘输入具体数值时,用FUNCTION 的输入方式会更加方便。假设输入数值所被保存的变量为INPUT-DATA,该变量定义如下。 01 INPUT-DATA PIC S999V99.
如令该变量中的数值通过键盘输入的语句如下。 ACCEPT INPUT-DATA FROM CONSOLE 此时用户需要在键盘上输入的数据必须严格按照INPUT-DATA定义的格式来进行。例如,当用户需要输入2.50和-100.00这两个数值时,输入方式必须为: +002.50 -100.00
当使用将字符串转换为具体数值的方式时,代码可以做如下更改。 01 INPUT-STR PIC X(10). 01 INPUT-DATA PIC S999V99. .... ACCEPT INPUT-STR FROM CONSOLE. COMPUTE INPUT-DATA=FUNCTION NUMVAL(INPUT-STR).
只要如下输入方式即可: 2.50 -100