abap数据类型转换_ABAP数据转换规则

附录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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值