COBOL语言数据类型转换方法

更新时间:2023-06-04 00:32:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

等。目前,这些工作大多数是在IBM ES9000主机的SAFE应用系统平台上进行,该系统联机程序和联机计息程序是用IBM 370汇编语言实现的。为方便汇编语言读写,在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-STORAGE SECTION. 中定义如下内容: WORKING-STORAGE SECTION. 01 DATE-CASE.

02 DATE-FIRST PIC X(3).

02 DATE-SIGN PIC 9(4) COMP VALUE 12.;定点二进制数

01 DATE-CHANGE REDEFINES DATE-CASE PIC 9(9) COMP-3. ;内部十进制数据

01 DATE-HEX PIC X(3). ; 转换前数据

01 DATE-DEC PIC S9(7)COMP-3 . ; 转换后数据 然后,在过程部PROCEDURE DEVISION.中加入如下语句: PROCEDURE DEVISION.

MOVE DATE-HEX TO DATE-FIRST . COMPUTE DATE-CHANGE = DATE- CHANGE / 1000.

MOVE DATE-CHANGE TO DATE-DEC. 由内部十进制转换为X(3)型

在进行相反的转换时,要消除因COBOL语言数据类型标志“C”引起的原日期数据前多加的一个0,所以需要将转换数据乘以10,再取出前6位数据即可。 首先,在COBOL程序WORKING-STORAGE SECTION. 中定义如下内容: WORKING-STORAGE SECTION.

01 WORK-DATE PIC S9(7) COMP-3. 01 AA REDEFINES WORK-DATE. 02 A1 PIC X(3). 02 A2 PIC X(1).

01 DATE-HEX PIC X(3). ;转换后数据 01 DATE-DEC PIC S9(7) COMP-3. ;转换前数据

然后,在过程部PROCEDURE DEVISION.中加入如下语句即可: PROCEDURE DIVISION.

MOVE DATE-DEC TO WORK-DATE。 COMPUTE WORK-DATE=WORK-DATE*10. MOVE A1 TO DATE-HEX .

=================================================================== 用法子句(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 语句

77 A PIC X(3) VALUE ‘ABC’。

77 B PIC X(5) VALUE ALL“*”。

PROCEDURE DIVISON.

STRING A 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 短语

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 P PIC 99.

MOVE 2 TO P.

STRING A B DELIMITED BY “C”

INTO C WITH POINTER P.

执行后,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: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 (后有一个空格)

COUNT-B值为4。

DELIMITER短语

DELIMITER(定位符存贮)短语

UNSTRING A DELIMITER BY “,” or “;” or ALL “/”

INTO B DELIMITER IN DELIM-B

C DELIMITER IN DELIM-C.

当没有匹配发生时,该接收项对应的定界符存贮区被清成空格

POINTER短语

用来指示发送项的字符位置

此短语通常 在单接收项的情况下与DELIMITER短语联合使用。

77 DELIM PIC X.

77 PNTR PIC 99.

77 ACCEPT-AREA PIC X(80).

01 DATA-RECORD

03 DATA-ITEM PIC 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

VARYING INDEX 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只发送了三个字符串,则TLY=3

本短语应在POINTER语句之后,而这2个短语又必须在DELIMITER和COUNT之后

OVERFLOW短语

溢出情况 1. 指针数值项值不合理,小于1或大于发送项长度。若不合理,不执行UNSTRING语句,控制转向溢出短语规定的命令语句

2. 当所有接收项已装满,但发送项尚有未和定界符茶杯的数据,或者尚有未被包含在发送字符串中的数据。此时先执行UNSTRING语句,而后控制转向溢出短语规定的命令语句

三.INSPECT语句

1> INSPECT/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”

2>INSPECT/REPLACING语句

INSPECT A 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

用-替代空格后第一次出现+的

3>INSPECT/TALLYING/REPLACING语句

MOVE ZERO TO TLY.

INSPECT A TALLYING TLY FOR ALL “L”

REPLACING LEADING “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的小数位数的方法 */

import java.math.BigDecimal;

//

数字字符串

String StrBd="1048576.1024";

//构造以字符串内容为值的BigDecimal类型的变量bd BigDecimal 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)。 注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN

接近零的舍入模式。

在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。 注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING 接近正无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同; 如果为负,则舍入行为与 ROUND_DOWN 相同。 注意,此舍入模式始终不会减少计算值。

4、ROUND_FLOOR 接近负无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同; 如果为负,则舍入行为与 ROUND_UP 相同。 注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN

相同。

注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

6、ROUND_HALF_DOWN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。

如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同; 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。 如果前一位为奇数,则入位,否则舍去。

以下例子为保留小数点1位,那么这种舍入方式下的结果。 1.15>1.2 1.25>1.2

8、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。

如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

本文来源:https://www.bwwdw.com/article/qen1.html

Top