天天看點

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

繼續閱讀