COBOL语言数据类型转换方法.docx
- 文档编号:30398606
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:24
- 大小:24.66KB
COBOL语言数据类型转换方法.docx
《COBOL语言数据类型转换方法.docx》由会员分享,可在线阅读,更多相关《COBOL语言数据类型转换方法.docx(24页珍藏版)》请在冰豆网上搜索。
COBOL语言数据类型转换方法
COBOL语言数据类型转换方法
计息是银行的一项重要业务,包括日常代理客户收、付计算客户利息和年度计息等。
目前,这些工作大多数是在IBMES9000主机的SAFE应用系统平台上进行,该系统联机程序和联机计息程序是用IBM370汇编语言实现的。
为方便汇编语言读写,在VSAM文件存储的数据中,数据存放格式进行了特殊的定义。
如日期存放采用X(3)型,01年03月15日,存入EBCD码为X‘010315’。
在进行年度计息时,为了实现各种复杂的运算工作,一般采用COBOL语言来实现各种运算。
而采用COBOL语言读取X(3)型数据时,读出的是字符型数据,不能直接进行运算,必须转换为COBOL数据类型的数据后才能进行相应处理。
如刚才的X‘010315’,需要转换为内部十进制数据X‘0010315C’。
本文介绍一种用COBOL语言实现字符型X(3)与内部十进制数据相互转换的方法。
由X(3)型转换为内部十进制
由于日期数据总是大于零,在COBOL语言的工作单元节定义变量DATE-FIRST后,再追加定义COBOL语言的最小数据单元X‘000C’,即十进制12。
由于重定义DATE-CASE为DATE-CHANGE后,DATE-CHANGE是原日期数据的1000倍,于是要在过程部将DATE-CHANGE除以1000。
首先,在COBOL程序WORKING-STORAGESECTION.中定义如下内容:
WORKING-STORAGESECTION.
01DATE-CASE.
02DATE-FIRSTPICX(3).
02DATE-SIGNPIC9(4)COMPVALUE12.;定点二进制数
01DATE-CHANGEREDEFINESDATE-CASEPIC9(9)COMP-3.;内部十进制数据
01DATE-HEXPICX(3).;转换前数据
01DATE-DECPICS9(7)COMP-3.;转换后数据
然后,在过程部PROCEDUREDEVISION.中加入如下语句:
PROCEDUREDEVISION.
MOVEDATE-HEXTODATE-FIRST.
COMPUTEDATE-CHANGE=DATE-
CHANGE/1000.
MOVEDATE-CHANGETODATE-DEC.
由内部十进制转换为X(3)型
在进行相反的转换时,要消除因COBOL语言数据类型标志“C”引起的原日期数据前多加的一个0,所以需要将转换数据乘以10,再取出前6位数据即可。
首先,在COBOL程序WORKING-STORAGESECTION.中定义如下内容:
WORKING-STORAGESECTION.
01WORK-DATEPICS9(7)COMP-3.
01AAREDEFINESWORK-DATE.
02A1PICX(3).
02A2PICX
(1).
01DATE-HEXPICX(3).;转换后数据
01DATE-DECPICS9(7)COMP-3.
;转换前数据
然后,在过程部PROCEDUREDEVISION.中加入如下语句即可:
PROCEDUREDIVISION.
MOVEDATE-DECTOWORK-DATE。
COMPUTEWORK-DATE=WORK-DATE*10.
MOVEA1TODATE-HEX.
===================================================================
用法子句(USAGE子句)使用用法(USAGE)子句可以使程序设计者自由选挥数据杯内存中的存放形式。
譬如,数据项A和B是需要多次进行运算,如果用外部十进制形式则来回转换会大大降低运算速度,这时,可以选择A和B为定点二进制形式或内部浮点形式.如果数据项C和D轻加运算次数少,而且需要多次打印出C和D的结果,这时用外部十进制比较适合,因为它最适合打印的要求,不必再进行转换。
USAGEISDISPLAY/COMPDISPLAY(标准数据形式。
一个字节放一字符)COMP定点二近制形式COMP-1:
内部短浮点形式COMP-2:
内部长浮点形式COMP-3:
内部十进制形式如果对组合项描述为某一种存放形式,则表示这个组合项的下属各初等项都是这种形式。
USAGE子句指定的数据存放形式不应与PIC子句指定的数据类型矛盾.长、短浮点形式己确定了内存的长度,不应再用PIC子句.用WRITE语句输出时,是直接按内存中存放数据形式输出(不加转换的).这是和用DISPLAY语句时不同的.
字符处理
一.STRING 语句
77 A PIC X(3) VALUE ‘ABC’。
77 B PIC X(5) VALUE ALL“*”。
PROCEDURE DIVISON.
…
STRING ADELIMITEDBYSIZEINTOB.
…
STRING语句执行后,B中内容为
ABC**
1.STRING语句经常把多个发送字符串连接成一个较成的字符串。
STRINGABCDELIMITEDBYSIZEINTOD.
2.发送不仅可以是变量,也可以是常量(不得为象征常量ALL)
STRINGPROVINCESPACECITY“ “STREETDELIMITEDBYSIZEINTIADDRESS.
SPACE,一个空格,同时在城市与街道间插入3个空格
DELIMITED短语
DELIMITED BY (定界)短语,除了使用保留字SIZE,表示整个发送项参加连接操作外,还可以在BY的后面使用字符值常量或字符型数据项。
BY后面的字值常量或数据项内容称作定界符。
在执行STRING语句时,发送项的内容以定界符为界,定界符左边的内容参加合并操作,定界符本身及其右方的内容舍去不用。
如果发送项中没有与定界符相匹配的内容,整个发送项全参加合并操作。
定界符可以是单字符,也可以是多字符的字符串 。
77 A PIC X(5) VALUE “ABCDE”。
77 B PIC X(5) VALUE “EFGHI”。
77 C PIC X(10) VALUE ALL“*”。
STRING A DELIMITED BY “C”,B DELIMITED BY “F“
INTO C。
则执行后,以的内容为
ABE*******。
POINTER短语
POINTER(指针)短语是针对接收项的,因为每个STRING语句只能有一个接收项,所以每个STRING语句只能有一个POINTER短语。
POINTER短语,用于规定接收项开始接收字符的起始位置。
这个位置用接收项字符位置的相对号来表示,接收项左起第1字节的相对号是1,第2字节的相对号是2,。
。
。
。
。
77 PPIC99.
MOVE2TOP.
STRINGABDELIMITEDBY“C”
INTOCWITHPOINTERP.
执行后,C的内容为
*ABEFGHI**
P的值变为9(2+7)。
OVERFLOW 短语
产生溢出的情况
1. 接收项已满,尚有未发送的字符。
2. 接收项已满,尚有未经处理的发送项
3. 指针短语中的指针变量值不合理,小于1或大于接收项长度。
STRING A B BY SIZE INTO C WITH POINTER P ON OVERFLOW GOTO ERR-OVER。
二.UNSTRING语句
UNSTRING语句与STRING语句作用相反,将字符串拆成若干字符串
规则:
如果发送项长度小于各接收项长度之和。
1. 某接收项未装满
2. 某接收项刚好装满,其右方各接收项没有接收内容。
对于1,系统将未接收项中尚未接收内容的字符位置填充空格,该接收项以右各接收项内容不变。
对于2,凡未已旧换新内容的项均维持原内容不变
UNSTRING A INTO B C。
DELIMITED 语句
定界符可以是单字符,也可以是多字符,但不可角STRING语句那样,采用保留字SIZE,必须是字符字值常量或字符型数据项。
如果发送项有多个字符或字符串与定界符匹配,则第一个匹配定界符以左的全部内容,作为一个发送字符串,发送给第一接收项,第二个匹配定界符以左,第一匹配定界符以右的内容,作为又一发送字符串,发送给第二接收项。
若2个匹配定界符连在一起,相应接收项则接空格或0。
一个定界短语可有多个定界符,各定界符之间用OR连接,OR表示各定界符只要一个与发送项匹配成功,就确定发送。
UNSTRING A DELIMITED BY “,“ OR ”。
“ INTO B C。
有时要以连续出现的同样字符作为定界符,在这种情况下,可在字符字值前冠以保留字ALL。
COUNT 短语
COUNT 短语是把发送字符串的长度记录在一个用户定义的数据项中
如A内容:
ABCD//E5
B:
PICXXX
C:
PICXXX
D:
PICXXX
执行
UNSTRINGADELIMTEDBY‘/’
INTOBCOUNTINCOUNT-B
C
D.
则B:
ABC
C:
(3个空格)
D:
E5(后有一个空格)
COUNT-B值为4。
DELIMITER短语
DELIMITER(定位符存贮)短语
UNSTRINGADELIMITERBY“,”or“;”orALL“/”
INTOBDELIMITERINDELIM-B
CDELIMITERINDELIM-C.
当没有匹配发生时,该接收项对应的定界符存贮区被清成空格
POINTER短语
用来指示发送项的字符位置
此短语通常 在单接收项的情况下与DELIMITER短语联合使用。
77 DELIM PICX.
77 PNTR PIC99.
77ACCEPT-AREA PICX(80).
01DATA-RECORD
03DATA-ITEM PIC9(6)
OCCURES10TIMES
INDEXEDBYINDEX.
PROCEDUREDIVISION.
DISPLAY“PLEASEENTERYOURDATA.”
ACCEPTACCEPT-AREA.
MOVE1TOPNTR.
MOVELOW-VALUETODELIM.
PERFORMUNSTR-PROCESS
VARYING INDEXFROM1BY1
UNTILDELIM=”*”
UNSTR-PROCESS.
UNSTRINGACCEPT-AREADELIMITEDBYALLSPACESor“*”
INTODATA-ITEM(INDEX)
DELIMITERINDELIM
WITHPROINTERPNTR.
TALLYING短语
计算实际接收到了多少数据
MOVEZEROTOTLY.
UNSTRIGNADELIMITEDBYALLSPACEor“*”
INTOBCDEF
TRLLYINGINTLY.
假如A只发送了三个字符串,则TLY=3
本短语应在POINTER语句之后,而这2个短语又必须在DELIMITER和COUNT之后
OVERFLOW短语
溢出情况
1. 指针数值项值不合理,小于1或大于发送项长度。
若不合理,不执行UNSTRING语句,控制转向溢出短语规定的命令语句
2. 当所有接收项已装满,但发送项尚有未和定界符茶杯的数据,或者尚有未被包含在发送字符串中的数据。
此时先执行UNSTRING语句,而后控制转向溢出短语规定的命令语句
三.INSPECT语句
1> INSPECT/TALLYING语句
INSPECTATALLYINGTLYFORALL“A”
对指定字符串的所有出现进行计数,即数据项中每出现一个指定的字符串,计数器就加1
INSPECTATALLYINGTLYFORLEADING“*”
对指定字符串作为前缀进行计数,计算数据项中从第一个字符开始连续出现多少指定的字符串。
INSPECTATALLYINGFLYFORCHARACTERS
对所有出现的字符进行计数
INSPECTATALLYINGT1FOR“.”AFTER“A”
T2FOR“;”BEFORE“B”
2>INSPECT/REPLACING语句
INSPECT AREPLACINGCHARACTERSBYSPACEBEFORE“*”.
用空格替代*前的全部字符
INSPECTAREPLACINGALL“AB”BY“XY”
ALL“CD”BY “AB”
用XY替代AB,AB替代CD
INSPECTAREPLACINGLEADINGSPACEBYZEROBEFORE“**”
用0替代**之前的前缀为空格的前缀
如:
A为__2_3**,替代后A为002_3**
A为1_2_3_**,替代后A不变
INSPECTAREPLACINGFIRST“+”BY“-“AFTERSPACE
用-替代空格后第一次出现+的
3>INSPECT/TALLYING/REPLACING语句
MOVEZEROTOTLY.
INSPECTATALLYINGTLYFORALL“L”
REPLACINGLEADING“A”BY“E”AFTER“L”.
磁盘顺序文件
1> OPEN语句
除了可以用INPUT OUTPUT方式找开文件外,还可以用I-O方式,即被打开的文件既可以输入,也可以输出
OPEN I-O DAFILE。
注:
不能同时用2种不同的方式打开同一个文件
2> CLOSE FILE1 WITH LOCK ,FILE2。
表示FILE1关闭后加以“锁住”,FILE2关闭后不锁住
3> REWRITE语句
意为重写,用相同长度的记录代替原来的记录,它只能用于由I-O方式打开的文件
以INPUT方式打开的文件只能读,以OUTPUT方式打开的文件只能写,以I-O方式打开的文件只能读和重写
/*由数字字符串构造BigDecimal的方法
*设置BigDecimal的小数位数的方法
*/
importjava.math.BigDecimal;
//数字字符串
StringStrBd="1048576.1024";
//构造以字符串内容为值的BigDecimal类型的变量bd
BigDecimalbd=newBigDecimal(StrBd);
//设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入)
bd=bd.setScale(2,BigDecimal.ROUND_HALF_UP);
//转化为字符串输出
StringOutString=bd.toString();
Java中BigDecimal的8种舍入模式
Postedon2010-12-1715:
39爱冷の心无悔阅读(459)评论(0) 编辑 收藏所属分类:
Java基础
java.math.BigDecimal
不可变的、任意精度的有符号十进制数。
BigDecimal由任意精度的整数非标度值和32位的整数标度(scale)组成。
如果为零或正数,则标度是小数点后的位数。
如果为负数,则将该数的非标度值乘以10的负scale次幂。
因此,BigDecimal表示的数值是(unscaledValue×10-scale)。
与之相关的还有两个类:
java.math.MathContext:
该对象是封装上下文设置的不可变对象,它描述数字运算符的某些规则,如数据的精度,舍入方式等。
java.math.RoundingMode:
这是一种枚举类型,定义了很多常用的数据舍入方式。
这个类用起来还是很比较复杂的,原因在于舍入模式,数据运算规则太多太多,
不是数学专业出身的人看着中文API都难以理解,这些规则在实际中使用的时候在翻阅都来得及。
在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。
其中8种舍入方式值得掌握。
1、ROUND_UP
舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。
不同舍入模式下的舍入操作汇总
根据给定的舍入模式将输入数字舍入为一位数的结果
输入数字
UP
DOWN
CEILING
FLOOR
HALF_UP
HALF_DOWN
HALF_EVEN
UNNECESSARY
5.5
6
5
6
5
6
5
6
抛出ArithmeticException
2.5
3
2
3
2
3
2
2
抛出ArithmeticException
1.6
2
1
2
1
2
2
2
抛出ArithmeticException
1.1
2
1
2
1
1
1
1
抛出ArithmeticException
1.0
1
1
1
1
1
1
1
1
-1.0
-1
-1
-1
-1
-1
-1
-1
-1
-1.1
-2
-1
-1
-2
-1
-1
-1
抛出ArithmeticException
-1.6
-2
-1
-1
-2
-2
-2
-2
抛出ArithmeticException
-2.5
-3
-2
-2
-3
-3
-2
-2
抛出ArithmeticException
-5.5
-6
-5
-5
-6
-6
-5
-6
抛出ArithmeticException
2、ROUND_DOWN
接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。
不同舍入模式下的舍入操作汇总
根据给定的舍入模式将输入数字舍入为一位数的结果
输入数字
UP
DOWN
CEILING
FLOOR
HALF_UP
HALF_DOWN
HALF_EVEN
UNNECESSARY
5.5
6
5
6
5
6
5
6
抛出ArithmeticException
2.5
3
2
3
2
3
2
2
抛出ArithmeticException
1.6
2
1
2
1
2
2
2
抛出ArithmeticException
1.1
2
1
2
1
1
1
1
抛出ArithmeticException
1.0
1
1
1
1
1
1
1
1
-1.0
-1
-1
-1
-1
-1
-1
-1
-1
-1.1
-2
-1
-1
-2
-1
-1
-1
抛出ArithmeticException
-1.6
-2
-1
-1
-2
-2
-2
-2
抛出ArithmeticException
-2.5
-3
-2
-2
-3
-3
-2
-2
抛出ArithmeticException
-5.5
-6
-5
-5
-6
-6
-5
-6
抛出ArithmeticException
3、ROUND_CEILING
接近正无穷大的舍入模式。
如果BigDecimal为正,则舍入行为与ROUND_UP相同;
如果为负,则舍入行为与ROUND_DOWN相同。
注意,此舍入模式始终不会减少计算值。
不同舍入模式下的舍入操作汇总
根据给定的舍入模式将输入数字舍入为一位数的结果
输入数字
UP
DOWN
CEILING
FLOOR
HALF_UP
HALF_DOWN
HALF_EVEN
UNNECESSARY
5.5
6
5
6
5
6
5
6
抛出ArithmeticException
2.5
3
2
3
2
3
2
2
抛出ArithmeticException
1.6
2
1
2
1
2
2
2
抛出ArithmeticException
1.1
2
1
2
1
1
1
1
抛出ArithmeticException
1.0
1
1
1
1
1
1
1
1
-1.0
-1
-1
-1
-1
-1
-1
-1
-1
-1.1
-2
-1
-1
-2
-1
-1
-1
抛出ArithmeticException
-1.6
-2
-1
-1
-2
-2
-2
-2
抛出ArithmeticException
-2.5
-3
-2
-2
-3
-3
-2
-2
抛出ArithmeticException
-5.5
-6
-5
-5
-6
-6
-5
-6
抛出ArithmeticException
4、ROUN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- COBOL 语言 数据类型 转换 方法