附录C数据转换规则
源类型
目标类型
转换规则
C
C
左对齐将源中的字符传输到目标字段中,如长度不同,则用空格从右边开始进行填充(短于目标时),则在右边将其内容截断(长于目标时)。注:源中的尾部空格不会被传输到目标字段中
C
D
源字段头8个字符传输到目标字段中。为了日期有效,头8个字符应包含格式为YYYYMMDD的8个数字字符日期,但实质每位可以是任意字符,转换时不会出错,并且会原样传输到目标字段中
C
F
源字段内容必须是类型F字段的有效表示。
先将源字段格式化为 E± ,尾数部分为整数只有一位的小数格式,如果尾数部分的小数位大小于16位,第17位会四舍五入截断
如果源全为空格,或者空格后面紧跟着非F类型所包含的合法字符时,则转换结果为0;如是有前导空格,但后面紧跟着的是合法的F格式字符,则还是会正确转换;如果含有的全是F格式合法字符,且中间含有空格时,空格后面所有合法的字符也不再被解析;如果不是以空格开头,且又含有非法字符,则运行时会抛出异常。
DATA: c(30) VALUE '123.012345678901274567', f TYPE f." 1.2301234567890127E+02
注:空格字符为F格式的合法字符,且空格后紧跟着的所有字符都会被忽略不处理,所以空格后面紧跟着的其他非法字符也是没有问题的,比如 ' 1 a'就可以合法转换,但 ' 1a' 运行时就会抛出异常
C
N
将源字段中的所有数字传输到目标字段中,并且是右对齐的方式。
如果目标字段过长,则会使用0来填充左边;如果目标字段过短,则左边多余的会截断
C
I、P
所有能转换的字符组成的结果不能超出I的取值范围(-2147483648~+2147483647),否则会抛出异常。
不能大于目标P所定义的长度,比如下面代码中,p最大只能为 999 ,如果再多一位,则运行时就会抛出异常
DATA: c(3) VALUE '999', p(2) TYPE p .
如果源全为空格,则转换结果为0;如是有前导空格,但后面紧跟着的是合法的I/P格式字符,则还是会正确转换;
与 C→F不同的是,' 1 2' 类似的串运行时会抛异常,也就是说,在源串中,空格只能为前导,而不能出现在中间,即使所有的字符都是I/P格式合法字符。
C
T
源字段应包含格式为HHMMSS的6个数字字符时间。其他规则与 C→D是一样的
C
X
源字段应包含十六进制字符串格式,有效字符为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F(注:字母都是大写,小写是无效的)。该字符串被视为十六进制数,左对齐传送,并且右边用零填充或截断。转换时,会从左到右来读取源中的所有合法的十六进制字符,如果一旦遇到一个不会合法的十六进制字符时,会立即终止读取,并且从这个非法字符到最后所有字符都会使用0来代替(另:不足目标长度时也会补0):
DATA: c(6) VALUE 'bBAAaa' , x(3) TYPE x.
x = c.
WRITE: x."000000
c = 'BBAAaa'.
x = c.
WRITE: x."BBAA00
C
String
以左对齐的方式将源字段中的字符传输到目标字段中,但不包括尾部空格。目标的长度由传输的字符个数来决定
C
XString
C→X规则也适用。
如果源中能转换的字符个数是奇数,则会在目标串的最后补一个0
D
C
参考 C→C
D
D
未转换传送
D
F
如果源字段为合法的 YYYYMMDD 的格式,则会使用该日期与 0001.01.01 日期相减,会得到一个数,这个数会存储到目标字段中;否则如果为非法日期格式,则结果为0
D
N
左对齐将源中的所有字符(不管是否是合法数字字符)都会被传输到目标字段中,如果目标字段过长,则会使用0来填充,如果过短,是会截断源的右边字符。
在传输过程中,源的尾部空格也会被传输到目标字段中。
D
I、P
如果源字段为合法的 YYYYMMDD 的格式,则会使用该日期与 0001.01.01 日期相减,会得到一个数,这个数会存储到目标字段中;否则如果为非法日期格式,则结果为0。
另外,如果目标字段为P类型,源结果如果太大运行时会抛异常
D
T
不支持该类型间转换,将导致语法检查错误信息或运行时错误
D
X
先D→I,再I→X
D
String
参考C→String
D
XString
先D→I,再I→Xstring
F
C
先将源字段转换为E±的格式,然后右对齐传送给C类型字段。
转换后的尾数小数格式(其小数的整数部分只有一位)取值范围为(-10,-1]、0、[1,10)(区间包括小数)
在转尾数部分时,被截部分会使用四舍五入法进行取舍
当F为正数时,尾数部分的正数会自动忽略,但指数总是带符号的
目标字段长度至少应为5字节(当F为0时)或者是6字节(当F非0时)
如果目标字段长度小于最小长度(5或者6字节时),则目标字段结果使用*填充
如果F转尾数部分后,尾数部分的小数位最多不能超过16位(如果多余16位,第17位及后面的会以四舍五入方式截断),且不足时补0,如果目标字段长度超过22字节(F为正时)或23字节(F为负时)时,左边会补空格
DATA: f VALUE '-0.0' TYPE f,c(5)."0E+00
DATA: f VALUE '-0.155' TYPE f,c(5)."*****
DATA: f VALUE '-0.155' TYPE f,c(6)."-2E-01
DATA: f VALUE '-0.155' TYPE f,c(7)." -2E-01
DATA: f VALUE '-0.155' TYPE f,c(8)."-1.6E-01
DATA: f VALUE '-0.155' TYPE f,c(9)."-1.55E-01
DATA: f VALUE '-0.155' TYPE f,c(10)."-1.550E-01
DATA: f VALUE '-0.155' TYPE f,c(24)." -1.5500000000000000E-01
F
D
先F→I,再I→D
F
F
未转换传送
F
N
先将源字段F通过四舍五入的方式转换为最接近的整数,然后以右对齐的方式将F转换整数的绝对值传输到目标字段中。如果目标字段过长,则会使用0填充左边,如果过短,则会将左边截断。
F
I
先将源字段F通过四舍五入的方式转换为最接近的整数,然后存储到目标字段中。如果超过目标字段的取值范围,则运行时会抛异常
F
P
将源字段F以四舍五入的方式转换为P类型的数据。但不能超出P的取值范围,否则运行时会抛异常
F
T
先F→I,再I→T
F
X
先F→I,再I→X
F
String
参考F→C。转换后目标字段的长度为22(为正数时)、23(为负数时)
F
XString
先F→I,再I→XString
N
C
参看 C→C
N
D
参看 C→D
N
F
参看 C→F
N
N
右对齐传送(包括局部空格),并在左边用0填充或截断
N
I、P
分别参看 C→I或者 C→P
N
T
参看 C→T
N
X
先N→I,再I→X
N
String
参看 C→String
N
XString
先N→I,再I→XString
P
C
右对齐方式传输。当P为负数时,最后一位必为减号“-”;当P为正数且C足够长时,最后一位可以是空格,如果不够,则不会有这个空格。
如果目标字段过长,左边会补空格,如果过短,左边会被截断,且此时第一位用一个星号*表示。
注:不管目标字段固定长度有多长,也不会千分位分隔符出现
DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(1)."*
DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(5)."*4567
DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(6)."*.4567
DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(7)."*3.4567
DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(8)."123.4567
DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(9)."123.4567
DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(10)."123.4567
DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(2)."*-
DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(3)."*7-
DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(9)."123.4567-
DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(10)."123.4567-
P
D
P→I,I→D
P
F
先将P格式化成 E± 格式的F,再对尾数部分的小数部分的第17位(如果小数位足够17位时情况下,没有就补0至16位)四舍五入
DATA: p(16) TYPE p DECIMALS 14 VALUE '-10000.0123456781235',f TYPE f." -1.0000012345678124E+04
DATA: p(16) TYPE p DECIMALS 14 VALUE '10000.0123456781235',f TYPE f." 1.0000012345678124E+0
DATA: p(16) TYPE p DECIMALS 14 VALUE '-1.01234567890123',f TYPE f." -1.0123456789012300E+00
P
N
四舍五入将P转换为整数,然后将其绝对值右对齐传输到目标中。不够时左边补0,超长时截断左边。
P
I
四舍五入将P转换为整数,然后存储到目标字段中。如果超过I取值范围,则抛异常
P
P
四舍五入将源字段小数部分格式化成目标字段的小数部分,然后存储到目标字段中。如果超出目标字段的取值范围,则运行时抛异常
DATA: p(4) TYPE p VALUE '12.34567' DECIMALS 5,p2(4) TYPE p DECIMALS 4."12.3457
P
T
先P→I,再I→T
P
X
先P→I,再I→X
P
String
右对齐方式传输。当P为负数时,最后一位必为减号“-”;当P为正数时,最后一位是空格。转换时不带千分位分隔符
P
XString
先P→I,再I→Xstring
T
C
参考 C→C
T
D
不支持该类型间转换,将导致语法检查错误信息或运行时错误
T
F
如果源字段T只包括数字(不会验证其有效性,如256060都可以),则会按着 hhmmss 格式求秒数:hh*3600+mm*60+ss ,再将结果存储到目标字段中。
如果源字段T只包括了其他非数字,则结果为0。
DATA: t TYPE t VALUE '256060',f TYPE f." 9.3660000000000000E+04
T
N
将源字段左对齐传输到目标字段中,包括空格。如果目标过长,则右边补0,如果过短,右边会被截断
T
I
如果源字段T只包括数字(不会验证其有效性,如256060都可以),则会按着 hhmmss 格式求秒数:hh*3600+mm*60+ss ,再将结果存储到目标字段中。
如果源字段T只包括了其他非数字,则结果为0。
T
P
如果源字段T只包括数字(不会验证其有效性,如256060都可以),则会按着 hhmmss 格式求秒数:hh*3600+mm*60+ss ,再将结果存储到目标字段中。
如果源字段T只包括了其他非数字,则结果为0。
如果超过目标字段大小,则运行时会抛异常
T
T
不会发生转换
T
X
先T→I,再I→X
T
String
参考C→String
T
XString
先T→I,再I→XString
X
C
将源字段中每4位转换成十六进制的字符 0~9、A~F,然后左对齐传输到目标字段中。如果目标字段过长,则右边补空格,如果过短,则右边会被截断
X
D
X→I,I→D
X
F
X→I,I→F
X
N
X→I,I→N
X
I
只是将源字段中最后4个字节转换为整数,如果源不足4字节,则左边会补十六进制0到4字节后再进行转换。
源的取值可以是:"00000000" to "7FFFFFFF" ,即 0~+2 147 483 647,"80000000" to "FFFFFFFF",即 -1~-2 147 483 648
DATA: x(1) TYPE x VALUE '10',i TYPE i."16
X
P
X→I,I→P
X
T
X→I,I→T
X
X
左对齐传送,如有必要,右边用X'00'进行填充或截断
X
String
将源字段中每4位转换成十六进制的字符 0~9、A~F,然后左对齐传输到目标字段中。传输的字符数决定了目标字段的长度
X
XString
左对齐传送。传输的字符数决定了目标字段的长度
I
C
右对齐方式传输(不包括千分位符号)。当I为负数时,最后一位必为减号“-”;当I为正数且C足够长时,最后一位可以是空格,如果不够,则不会有这个空格。
如果目标字段过长,左边会补空格,如果过短,左边会被截断,且此时第一位用一个星号*表示。
DATA: i TYPE i VALUE '123',c(1)."*
DATA: i TYPE i VALUE '123',c(2)."*3
DATA: i TYPE i VALUE '123',c(3)."123
DATA: i TYPE i VALUE '123',c(4)."123
DATA: i TYPE i VALUE '123',c(5)." 123
DATA: i TYPE i VALUE '-123',c(2)."*-
DATA: i TYPE i VALUE '-123',c(3)."*3-
DATA: i TYPE i VALUE '-123',c(5)." 123-
I
D
此时I的取值范围只能为1 ~ 3652060,如果超过此范围,则D会以0来填充。如果I有效,则会从0001.01.01日期加上这个天数,则会将得到日期存储到D中
I
F
将源字段以F类型格式化后存储到目标字段中
I
N
右对齐将源字段的绝对值传输到目标字段中。如果目标字段过长,则在左边补0,如果过短,则将左边截断
I
I
不会发生类型转换
I
P
将源以P类型格式化后存入目标字段中。如果源字段大小超出了目标取值范围,则运行时抛出异常
I
T
以I以除86400的余数来表示从午夜00:00:00所经历的秒数,从而转换成相应的时间点后存储到T中。
DATA: i TYPE i VALUE '1',t TYPE t."000001
DATA: i TYPE i VALUE '3601',t TYPE t."010001
DATA: i TYPE i VALUE '86399',t type t."235959
DATA: i TYPE i VALUE '86400',t type t."000000
DATA: i TYPE i VALUE '86401',t type t."000001除以86400后得余数1,以1来计算时间点
I
X
将I的4个字节以高字节序(即人的阅读习惯顺序,程序中的赋值方式只能是高字节序方式)转换为十六进制后,以右对齐方式存储到X字段中。如果X过长,则左边使用十六进制0来填充,如果太短,则会截断左边
I
String
右对齐方式传输(不包括千分位符号)。当I为负数时,最后一位为减号“-”;当I为正数时(包括0),最后一位是空格。
I
XString
将I的4个字节以高字节序(即人的阅读习惯顺序,程序中的赋值方式只能是高字节序方式)转换为十六进制后存储到X字段中
如果I为负数,则目标长度为8。如果I为正数,则目标长度可能为2、4、6、8
DATA: i TYPE i VALUE '0',xstr TYPE xstring."00
DATA: i TYPE i VALUE '1',xstr TYPE xstring."01
DATA: i TYPE i VALUE '256',xstr TYPE xstring."0100
DATA: i TYPE i VALUE '65536',xstr TYPE xstring."010000
DATA: i TYPE i VALUE '16777216',xstr TYPE xstring."01000000
DATA: i TYPE i VALUE '-1',xstr TYPE xstring."FFFFFFFF
DATA: i TYPE i VALUE '-256',xstr TYPE xstring."FFFFFF00
DATA: i TYPE i VALUE '-65536',xstr TYPE xstring."FFFF0000
DATA: i TYPE i VALUE '-16777216',xstr TYPE xstring."FF000000
String
C
参考C→C,与此规则不同的是,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用空格来填充
String
D
参考C→D,与此规则不同的是,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充
String
F
参考C→F,并且,如果源字段的长度为0,则结果也为0
String
N
参考C→N,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充
String
I
参考C→I,并且,如果源字段的长度为0,则结果也为0
String
P
参考C→P,并且,如果源字段的长度为0,则结果也为0
String
T
参考C→T,并且源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充
String
X
参考C→X,如果源字段长度为0,则会使用十六进制的0来填充目标字段
String
String
不会发生转换。只是目标字段会重新指向源字段字符串
String
XString
参考C→XString。如果源字段长度为0,则目标字段的长度也会是0
XString
C
参考X→C。如果源字段的长度为0,则目标字段为会使用空格来填充
XString
D
参考X→D。如果源字段的长度为0,则目标字段为会使用0来填充
XString
F
参考X→F,并且,如果源字段的长度为0,则结果也为0
XString
N
参考X→N,源字段的尾部空格也会被传输到目标字段中。如果源字段的长度为0,则目标字段为会使用0来填充
XString
I
参考X→I,并且,如果源字段的长度为0,则结果也为0
XString
P
参考X→P,并且,如果源字段的长度为0,则结果也为0
XString
T
参考X→T。如果源字段的长度为0,则目标字段为会使用0来填充
XString
X
参考X→X,如果源字段长度为0,则会使用十六进制的0来填充目标字段
XString
String
参考X→String。如果源字段长度为0,则目标字段的长度也会是0
XString
XString
参考X→XString。如果源字段长度为0,则目标字段的长度也会是0