COBOL语言数据类型转换方法.doc_第1页
COBOL语言数据类型转换方法.doc_第2页
COBOL语言数据类型转换方法.doc_第3页
COBOL语言数据类型转换方法.doc_第4页
COBOL语言数据类型转换方法.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

COBOL语言数据类型转换方法计息是银行的一项重要业务,包括日常代理客户收、付计算客户利息和年度计息等。目前,这些工作大多数是在IBM ES9000主机的SAFE应用系统平台上进行,该系统联机程序和联机计息程序是用IBM 370汇编语言实现的。为方便汇编语言读写,在VSAM文件存储的数据中,数据存放格式进行了特殊的定义。如日期存放采用X(3)型,01年03月15日,存入EBCD码为X010315。在进行年度计息时,为了实现各种复杂的运算工作,一般采用COBOL语言来实现各种运算。而采用COBOL语言读取X(3)型数据时,读出的是字符型数据,不能直接进行运算,必须转换为COBOL数据类型的数据后才能进行相应处理。如刚才的X010315,需要转换为内部十进制数据X0010315C。本文介绍一种用COBOL语言实现字符型X(3)与内部十进制数据相互转换的方法。 由X(3)型转换为内部十进制 由于日期数据总是大于零,在COBOL语言的工作单元节定义变量DATEFIRST后,再追加定义COBOL语言的最小数据单元X000C,即十进制12。由于重定义DATECASE为DATECHANGE后,DATECHANGE是原日期数据的1000倍,于是要在过程部将DATECHANGE除以1000。 首先,在COBOL程序WORKINGSTORAGE SECTION. 中定义如下内容: WORKINGSTORAGE SECTION. 01 DATECASE. 02 DATEFIRST PIC X(3).02 DATESIGN PIC 9(4) COMP VALUE 12.;定点二进制数01 DATECHANGE REDEFINES DATECASE PIC 9(9) COMP3. ;内部十进制数据 01 DATEHEX PIC X(3). ; 转换前数据 01 DATEDEC PIC S9(7)COMP3 . ; 转换后数据 然后,在过程部PROCEDURE DEVISION.中加入如下语句: PROCEDURE DEVISION. MOVE DATEHEX TO DATEFIRST . COMPUTE DATECHANGE = DATE CHANGE / 1000.MOVE DATECHANGE TO DATEDEC. 由内部十进制转换为X(3)型 在进行相反的转换时,要消除因COBOL语言数据类型标志“C”引起的原日期数据前多加的一个0,所以需要将转换数据乘以10,再取出前6位数据即可。 首先,在COBOL程序WORKINGSTORAGE SECTION. 中定义如下内容: WORKINGSTORAGE SECTION. 01 WORKDATE PIC S9(7) COMP3. 01 AA REDEFINES WORKDATE. 02 A1 PIC X(3). 02 A2 PIC X(1). 01 DATEHEX PIC X(3). ;转换后数据 01 DATEDEC PIC S9(7) COMP3. ;转换前数据 然后,在过程部PROCEDURE DEVISION.中加入如下语句即可: PROCEDURE DIVISION.MOVE DATEDEC TO WORKDATE。 COMPUTE WORKDATE=WORKDATE10. MOVE A1 TO DATEHEX . =用法子句(USAGE子句) 使用用法(USAGE)子句可以使程序设计者自由选挥数据杯内存中的存放形式。譬如,数据项A和B是需要多次进行运算,如果用外部十进制形式则来回转换会大大降低运算速度,这时,可以选择A和B为定点二进制形式或内部浮点形式如果数据项C和D轻加运算次数少,而且需要多次打印出C和D的结果,这时用外部十进制比较适合,因为它最适合打印的要求,不必再进行转换。 USAGE IS DISPLAY/COMP DISPLAY (标准数据形式。一个字节放一字符) COMP 定点二近制形式 COMP-1:内部短浮点形式 COMP-2:内部长浮点形式 COMP-3:内部十进制形式如果对组合项描述为某一种存放形式,则表示这个组合项的下属各初等项都是这 种形式。 USAGE子句指定的数据存放形式不应与PIC子句指定的数据类型矛盾长、短浮点形式己确定了内存的长度,不应再用PIC子句 用WRITE语句输出时,是直接按内存中存放数据形式输出(不加转换的)这是和用DISPLAY语句时不同的 字符处理 一STRING语句 77APICX(3)VALUEABC。 77BPICX(5)VALUEALL“”。 PROCEDUREDIVISON. STRINGA DELIMITED BY SIZE INTO B. STRING语句执行后,B中内容为 ABC* 1.STRING语句经常把多个发送字符串连接成一个较成的字符串。 STRING A B C DELIMITED BY SIZE INTO D. 2.发送不仅可以是变量,也可以是常量(不得为象征常量ALL) STRING PROVINCE SPACE CITY “ “ STREET DELIMITED BY SIZE INTI ADDRESS. SPACE,一个空格,同时在城市与街道间插入3个空格 DELIMITED 短语 DELIMITEDBY(定界)短语,除了使用保留字SIZE,表示整个发送项参加连接操作外,还可以在BY的后面使用字符值常量或字符型数据项。BY后面的字值常量或数据项内容称作定界符。在执行STRING语句时,发送项的内容以定界符为界,定界符左边的内容参加合并操作,定界符本身及其右方的内容舍去不用。如果发送项中没有与定界符相匹配的内容,整个发送项全参加合并操作。定界符可以是单字符,也可以是多字符的字符串。 77APICX(5)VALUE“ABCDE”。 77BPICX(5)VALUE“EFGHI”。 77CPICX(10)VALUEALL“”。 STRINGADELIMITEDBY“C”,BDELIMITEDBY“F“ INTOC。 则执行后,以的内容为 ABE。 POINTER短语 POINTER(指针)短语是针对接收项的,因为每个STRING语句只能有一个接收项,所以每个STRING语句只能有一个POINTER短语。 POINTER短语,用于规定接收项开始接收字符的起始位置。这个位置用接收项字符位置的相对号来表示,接收项左起第1字节的相对号是1,第2字节的相对号是2,。77P PIC 99. MOVE 2 TO P. STRING A B DELIMITED BY “C” INTO C WITH POINTER P. 执行后,C的内容为 *ABEFGHI* P的值变为9(27)。 OVERFLOW短语 产生溢出的情况 1接收项已满,尚有未发送的字符。 2接收项已满,尚有未经处理的发送项 3指针短语中的指针变量值不合理,小于1或大于接收项长度。 STRINGABBYSIZEINTOCWITHPOINTERPONOVERFLOWGOTOERROVER。 二UNSTRING语句 UNSTRING语句与STRING语句作用相反,将字符串拆成若干字符串 规则: 如果发送项长度小于各接收项长度之和。 1某接收项未装满 2某接收项刚好装满,其右方各接收项没有接收内容。 对于1,系统将未接收项中尚未接收内容的字符位置填充空格,该接收项以右各接收项内容不变。 对于2,凡未已旧换新内容的项均维持原内容不变 UNSTRINGAINTOBC。 DELIMITED语句 定界符可以是单字符,也可以是多字符,但不可角STRING语句那样,采用保留字SIZE,必须是字符字值常量或字符型数据项。 如果发送项有多个字符或字符串与定界符匹配,则第一个匹配定界符以左的全部内容,作为一个发送字符串,发送给第一接收项,第二个匹配定界符以左,第一匹配定界符以右的内容,作为又一发送字符串,发送给第二接收项。若2个匹配定界符连在一起,相应接收项则接空格或0。 一个定界短语可有多个定界符,各定界符之间用OR连接,OR表示各定界符只要一个与发送项匹配成功,就确定发送。 UNSTRINGADELIMITEDBY“,“OR”。“INTOBC。 有时要以连续出现的同样字符作为定界符,在这种情况下,可在字符字值前冠以保留字ALL。 COUNT短语 COUNT短语是把发送字符串的长度记录在一个用户定义的数据项中 如A内容:ABCD/E5 B:PIC XXX C:PIC XXX D:PIC XXX 执行 UNSTRING A DELIMTED BY / INTO B COUNT IN COUNT-B C D. 则B:ABC C:(3个空格) D:E5 (后有一个空格) COUNTB值为4。 DELIMITER短语 DELIMITER(定位符存贮)短语 UNSTRING A DELIMITER BY “,” or “;” or ALL “/” INTO B DELIMITER IN DELIM-B C DELIMITER IN DELIM-C. 当没有匹配发生时,该接收项对应的定界符存贮区被清成空格 POINTER短语 用来指示发送项的字符位置 此短语通常在单接收项的情况下与DELIMITER短语联合使用。 77 DELIMPIC X. 77PNTRPIC 99. 77 ACCEPT-AREAPIC X(80). 01 DATA-RECORD 03 DATA-ITEMPIC 9(6) OCCURES 10 TIMES INDEXED BY INDEX. PROCEDURE DIVISION. DISPLAY “PLEASE ENTER YOUR DATA.” ACCEPT ACCEPT-AREA. MOVE 1 TO PNTR. MOVE LOW-VALUE TO DELIM. PERFORM UNSTR-PROCESS VARYINGINDEX FROM 1 BY 1 UNTIL DELIM=”*” UNSTR-PROCESS. UNSTRING ACCEPT-AREA DELIMITED BY ALL SPACES or “*” INTO DATA-ITEM(INDEX) DELIMITER IN DELIM WITH PROINTER PNTR. TALLYING 短语 计算实际接收到了多少数据 MOVE ZERO TO TLY. UNSTRIGN A DELIMITED BY ALL SPACE or “*” INTO B C D E F TRLLYING IN TLY. 假如A只发送了三个字符串,则TLY3 本短语应在POINTER语句之后,而这2个短语又必须在DELIMITER和COUNT之后 OVERFLOW短语 溢出情况 1指针数值项值不合理,小于1或大于发送项长度。若不合理,不执行UNSTRING语句,控制转向溢出短语规定的命令语句 2当所有接收项已装满,但发送项尚有未和定界符茶杯的数据,或者尚有未被包含在发送字符串中的数据。此时先执行UNSTRING语句,而后控制转向溢出短语规定的命令语句 三INSPECT语句 1INSPECT/TALLYING语句 INSPECT A TALLYING TLY FOR ALL “A” 对指定字符串的所有出现进行计数,即数据项中每出现一个指定的字符串,计数器就加1 INSPECT A TALLYING TLY FOR LEADING “*” 对指定字符串作为前缀进行计数,计算数据项中从第一个字符开始连续出现多少指定的字符串。 INSPECT A TALLYING FLY FOR CHARACTERS 对所有出现的字符进行计数 INSPECT A TALLYING T1 FOR “.” AFTER “A” T2 FOR “;” BEFORE “B” 2INSPECT/REPLACING语句 INSPECTA REPLACING CHARACTERS BY SPACE BEFORE “*”. 用空格替代前的全部字符 INSPECT A REPLACING ALL “AB” BY “XY” ALL “CD” BY“AB” 用XY替代AB,AB替代CD INSPECT A REPLACING LEADING SPACE BY ZERO BEFORE “*” 用0替代之前的前缀为空格的前缀 如:A为_ _ 2_ 3*,替代后A为002_3* A为1_2_3_*,替代后A不变 INSPECT A REPLACING FIRST “+” BY “-“ AFTER SPACE 用-替代空格后第一次出现的 3INSPECT/TALLYING/REPLACING语句 MOVE ZERO TO TLY. INSPECT A TALLYING TLY FOR ALL “L” REPLACING LEADING “A” BY “E” AFTER “L”.磁盘顺序文件 1OPEN语句 除了可以用INPUTOUTPUT方式找开文件外,还可以用IO方式,即被打开的文件既可以输入,也可以输出 OPENIODAFILE。 注:不能同时用2种不同的方式打开同一个文件 2CLOSEFILE1WITHLOCK,FILE2。 表示FILE1关闭后加以“锁住”,FILE2关闭后不锁住 3REWRITE语句 意为重写,用相同长度的记录代替原来的记录,它只能用于由IO方式打开的文件 以INPUT方式打开的文件只能读,以OUTPUT方式打开的文件只能写,以IO方式打开的文件只能读和重写/*由数字字符串构造BigDecimal的方法*设置BigDecimal的小数位数的方法*/import java.math.BigDecimal;/数字字符串String StrBd=1048576.1024;/构造以字符串内容为值的BigDecimal类型的变量bdBigDecimal bd=new BigDecimal(StrBd);/设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入)bd=bd.setScale(2, BigDecimal.ROUND_HALF_UP);/转化为字符串输出String OutString=bd.toString(); Java中BigDecimal的8种舍入模式 Posted on 2010-12-17 15: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)。注意,此舍入模式始终不会减少计算值的大小。不同舍入模式下的舍入操作汇总根据给定的舍入模式将输入数字舍入为一位数的结果输入数字UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY5.56565656抛出 ArithmeticException2.53232322抛出 ArithmeticException1.62121222抛出 ArithmeticException1.12121111抛出 ArithmeticException1.011111111-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抛出 ArithmeticException2、ROUND_DOWN接近零的舍入模式。在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。注意,此舍入模式始终不会增加计算值的大小。不同舍入模式下的舍入操作汇总根据给定的舍入模式将输入数字舍入为一位数的结果输入数字UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY5.56565656抛出 ArithmeticException2.53232322抛出 ArithmeticException1.62121222抛出 ArithmeticException1.12121111抛出 ArithmeticException1.011111111-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抛出 ArithmeticException3、ROUND_CEILING接近正无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。注意,此舍入模式始终不会减少计算值。 不同舍入模式下的舍入操作汇总根据给定的舍入模式将输入数字舍入为一位数的结果输入数字UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY5.56565656抛出 ArithmeticException2.53232322抛出 ArithmeticException1.62121222抛出 ArithmeticException1.12121111抛出 ArithmeticException1.011111111-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抛出 ArithmeticException4、ROUND_FLOOR接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。注意,此舍入模式始终不会增加计算值。不同舍入模式下的舍入操作汇总根据给定的舍入模式将输入数字舍入为一位数的结果输入数字UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY5.56565656抛出 ArithmeticException2.53232322抛出 ArithmeticException1.62121222抛出 ArithmeticException1.12121111抛出 ArithmeticException1.011111111-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抛出 ArithmeticException5、ROUND_HALF_UP向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分 = 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。不同舍入模式下的舍入操作汇总根据给定的舍入模式将输入数字舍入为一位数的结果输入数字UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY5.56565656抛出 ArithmeticException2.53232322抛出 ArithmeticException1.62121222抛出 ArithmeticException1.12121111抛出 ArithmeticException1.011111111-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抛出 ArithmeticException6、ROUND_HALF_DOWN向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。如果舍弃部分 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。 不同舍入模式下的舍入操作汇总根据给定的舍入模式将输入数字舍入为一位数的结果输入数字UPDOWNCEILINGFLOORHALF_UPHALF_DOWNHALF_EVENUNNECESSARY5.56565656抛出 ArithmeticException2.53232322抛出 ArithmeticException1.62121222抛出 ArithmeticException1.12121111抛出 ArithmeticException1.011111111-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抛出 ArithmeticException7、ROUND_HALF_EVEN向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论