ABAP--字符串变量和字符变量的区别ABAP--字符串变量和字符变量的区别
字符变量字符变量是通过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 errorREPLACE 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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论