字符变量
字符变量是通过DATA语句后面跟上TYPE C进行定义的,且跟上LENGTH n来定义字符变量的长度。字符变量的长度定义后就不能再改变,它没有象C语言用'/0'表示字符变量结束。在ABAP中所有在字符右边的空格都将被忽略,也就是说将一个由空格字组成字符串赋值给字符变量,系统仍然认为是个空字符串(empty/initial)。
DATA: cvar TYPE c LENGTH 20,
len TYPE i.
cvar = ' '.
len = STRLEN( cvar ).
WRITE:/ 'Charlen: ', len.
这段代码将一个由空格组成的字符串赋值给字符变量,系统得到变量长度是0.
注意:有一个特例,在concatenate语句中的separated by ' ',该语句中的 ' '将作为空格处理而非空字符串处理。
字符串变量
字符串变量在内存里是由两部分组成:数据管理头和字符串数据。在数据管理头里有指向字符串数据指针域和字符串长度指示域。字符串变量最大理论长度为2147483647个字符,它的长度常常受 ztta/max_memreq_MB 参数和并发处理进程限制。
DATA: svar TYPE string,
len TYPE i.
svar = ' '.
len = STRLEN( svar ).
WRITE:/ 'Stringlen: ', len.
运行该段代码,字符串的长度也是0。这主要由于字符常量' '在ABAP里当作字符变量处理,这样空格就被忽略了(也就是认为是初始化的)。
我们可以使用字符串常量来避免该问题。字符串常量和字符常量的区别主要起始和结束的标记符号不同,字符串常量使用“`”,字符常量使用“'”。使用字符串常量` `,我们将可以得到包含空格的字符串变量,系统将不忽略尾部的空格。
expected result:
DATA: svar TYPE string,
len TYPE i.
svar = ` `.
len = STRLEN( svar ).
WRITE:/ 'Stringlen: ', len.
注意:ABAP将保留关键字SPACE定义为一个字符长度的字符常量,参见系统代码单元:<SYSINI>。因此,将SPACE赋值给字符串变量,字符串变量认为空,而非是一个空格。如果要将空格串赋值给字符串变量,我们就需要用到字符串常量赋值。请参见下面用空格替换分号的代码:
DATA: cvar TYPE c LENGTH 20,
svar TYPE string,
len TYPE i.
cvar = 'A;B;C;D;E'.
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH ' '. " (1)
WRITE:/ cvar.
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH space. " (2)
WRITE:/ cvar.
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH ` ` . " (3)
WRITE:/ cvar.
svar = `A;B;C;D;E`.
REPLACE ALL OCCURRENCES OF ';' IN svar WITH ` `. " (4)
WRITE:/ svar.
运行该代码我们看到 (1) 和 (2)没有得到需要的结构,字符常量(space 和' ')都被系统当作空字符处理,而非空格字符处理。 代码(3) 也不能得出正确的结果,主要由于` `将先转换为字符变量,再参与计算,这样空格又被忽略。只有代码(4) 才能得到我们需要的结果: A B C D E.
与其他类型变量混合使用
DATA: cvar TYPE c LENGTH 20,svar TYPE string,pvar TYPE p LENGTH 5,l TYPE i.
pvar = 5.
cvar = pvar.
l = STRLEN( cvar ).
WRITE:/ 'Content: |', cvar, '| (', l, ')'.
svar = pvar.
l = STRLEN( svar ).
WRITE:/ 'Content: |', svar, '| (', l, ')'.
pvar = - 5.
cvar = pvar.
l = STRLEN( cvar ).
WRITE:/ 'Content: |', cvar, '| (', l, ')'.
svar = pvar.
l = STRLEN( svar ).
WRITE:/ 'Content: |', svar, '| (', l, ')'.
使用字符变量将使用右对齐的转换进行赋值,其中最右边一位为符号位,如果是正5符号将为空格将被忽略,字符长度将为19。如果负5的话符号将为"-"占用,那样字符长度将为20.
使用字符串变量将使用左对齐的转换进行赋值,其中最左边一位为符号位,,如果是正5符号将为空格,字符长度将为2。如果负5的话符号将为"-"占用,那样字符长度仍然为2.
对于这个赋值转换差异,大家在代码处理时一定要注意。
使用字符串变量的缺点
很多人都会认为使用字符串变量将会影响性能,其实这对于ABAP系统来说不是很大问题,ABAP程序的性能更多取决数据的处理性能。
子串处理
使用字符变量你可以使用下列方式进行字串赋值。
DATA: cvar TYPE c LENGTH 20,svar TYPE stringi.
cvar = 'Hello World'.
cvar+5(1) = ','.
write:/ cvar.
但对于字符串变量,你就不能这么操作,你就得需要使用REPLACE命令进行字串处理。
DATA: cvar TYPE c LENGTH 20,svar TYPE stringi.
svar = 'Hello World'."
svar+5(1) = ','. <= compiler error
REPLACE SECTION OFFSET 5 LENGTH 1 OF svar WITH ','.
WRITE:/ svar.
So, you have to write a little bit more code.
字符串翻译
If you need to translate your report to different languages you can just add a nummer in brackets after the literal 'Error Message'(001) which is more readable as text-001. This is not working with string literals.
几个常用字符串处理类
CL_ABAP_CHAR_UTILITIES
CL_ABAP_STRING_UTILITIES
Source URL:http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/15889