3.3预定义Function
1.Logic Functions
示例:
"预定义Function
FORM f_pre_functions_logic.
"调用function
"语法:func( val )
"语法:func( param1 = val1 param2 = val2 ……)
"1.Logical Functions
"布尔function
"boolc, boolx
"boolc( log_exp ),返回string
"boolx( bool = log_exp bit = bit ),返回xstring
DATA:lv_bool TYPE string.
lv_bool = boolc( lv_bool IS INITIAL ).
WRITE:/ lv_bool.
"包含function
"contains, contains_any_of, contains_any_not_of
"语法:
"1.contains( val = text sub|start|end = substring [case = case]
"[off = off] [len = len] [occ = occ] )
"2.contains( val = text regex = regex [case = case]
"[off = off] [len = len] [occ = occ] )
"3.contains_any_of( val = text sub|start|end = substring
"[off = off] [len = len] [occ = occ] )
"4.contains_any_not_of( val = text sub|start|end = substring
"[off = off] [len = len] [occ = occ] )
"case:是否大小写敏感;off:匹配开始偏移量;len:偏移量后长度字符串匹配;occ:匹配次数,默认1
DATA:lv_con1 TYPE string.
DATA:lv_con2 TYPE string.
lv_con1 = 'hello world'.
lv_con2 = 'wo'.
"contains,相当于CS;not contains,相当于NS
"contains_any_of,相当于CA;not contians_any_of,相当于NA
"contains_any_not_of,相当于CN,not contians_any_not_of,相当于CO
IF contains( val = lv_con1 sub = lv_con2 case = 'X' off = 0 len = 5 occ = 1 ).
WRITE:/ 'test contains,true'.
ELSE.
WRITE:/ 'test contains,false'.
ENDIF.
IF contains( val = lv_con1 sub = lv_con2 case = 'X' off = 0 len = strlen( lv_con1 ) occ = 1 ).
WRITE:/ 'test contains,true'.
ELSE.
WRITE:/ 'test contains,false'.
ENDIF.
"匹配function
"matches
"语法:
"matches( val = text regex = regex [case = case]
"[off = off] [len = len] )
"match( val = text regex = regex [case = case] [occ = occ] )
IF matches( val = lv_con1 regex = '^h.*' case = 'X' off = 0 len = strlen( lv_con1 ) ).
WRITE:/ 'test match,true'.
ELSE.
WRITE:/ 'test match,false'.
ENDIF.
"match返回匹配子串
lv_con2 = match( val = lv_con1 regex = '^h.{0,5}' case = 'X' ).
WRITE:/ lv_con2.
ENDFORM.
2.Number Functions
示例:
FORM f_pre_functions_number.
"2.Numerical Functions
"abs, ceil, floor, frac, sign, trunc
"abs绝对值
DATA:lv_abs1 TYPE I VALUE -20.
DATA:lv_abs2 TYPE F VALUE '-2.333'.
lv_abs1 = abs( lv_abs1 ).
lv_abs2 = abs( lv_abs2 ).
WRITE:/ lv_abs1,lv_abs2.
"ceil不小于arg的最小整数
"floor不大于arg的最大整数
DATA:lv_cf1 TYPE F VALUE '3.21'.
DATA:lv_cf2 TYPE I.
lv_cf2 = ceil( lv_cf1 ).
WRITE:/ lv_cf2.
lv_cf2 = floor( lv_cf1 ).
WRITE:/ lv_cf2.
"frac小数部分
"trunc整数部份
DATA:lv_ft TYPE F VALUE '3.992'.
DATA:lv_frac TYPE F.
DATA:lv_trunc TYPE I.
lv_frac = frac( lv_ft ).
lv_trunc = trunc( lv_ft ).
WRITE:/ lv_frac,lv_trunc.
"nmax, nmin
"语法:nmax|nmin( val1 = arg1 val2 = arg2 [val3 = arg3] ... [val9 = arg9] )
DATA:lv_val TYPE I.
DATA:lv_val1 TYPE F VALUE '3.22'.
DATA:lv_val2 TYPE I VALUE 1.
DATA:lv_val3 TYPE P LENGTH 8 DECIMALS 2 VALUE '4.22'.
DATA:lv_val4 TYPE DECFLOAT16 VALUE '4.67'.
DATA:lv_val5 TYPE DECFLOAT34 VALUE '5.33'.
lv_val = nmax( val1 = lv_val1 val2 = lv_val2 val3 = lv_val3 val4 = lv_val4 val5 = lv_val5 ).
WRITE:/ lv_val.
lv_val = nmin( val1 = lv_val1 val2 = lv_val2 val3 = lv_val3 val4 = lv_val4 val5 = lv_val5 ).
WRITE:/ lv_val.
"acos, asin, atan, cos, sin, tan, cosh, sinh, tanh, exp, log, log10, sqrt
"反三角函数,三角函数,双曲三角函数,自然对数,开方
"round, rescale 四舍五入
"语法:
"round( val = arg {dec = n}|{prec = n} [mode = m] )
"dec 指定小数字数I,prec 指定精度I,mode 模式
"CL_ABAP_MATH类中模式
*ROUND_HALF_UP 如果中间值,向上舍入,
*ROUND_HALF_DOWN 如果中间值,向下舍入
*ROUND_HALF_EVEN 四舍五入,最后一位小数为偶数
*ROUND_UP 向上舍入
*ROUND_DOWN 向下舍入
*ROUND_CEILING
*ROUND_FLOOR
DATA:lv_round TYPE DECFLOAT34.
DATA:lv_round1 TYPE F VALUE '3.284'.
"返回3.28
lv_round = round( val = lv_round1 dec = 2 mode = CL_ABAP_MATH=>ROUND_HALF_UP ).
WRITE:/ lv_round.
"3
lv_round = round( val = lv_round1 prec = 1 mode = CL_ABAP_MATH=>ROUND_HALF_DOWN ).
WRITE:/ lv_round.
"3.28
lv_round = round( val = lv_round1 dec = 2 mode = CL_ABAP_MATH=>ROUND_HALF_EVEN ).
WRITE:/ lv_round.
"3.29
lv_round = round( val = lv_round1 dec = 2 mode = CL_ABAP_MATH=>ROUND_UP ).
WRITE:/ lv_round.
"语法:
"rescale( val = arg {dec = n}|{prec = n} [mode = m] )
"更改浮点数小数点位置,返回decfloat34
DATA:lv_scale TYPE DECFLOAT34.
DATA:lv_scale1 TYPE F VALUE '12345.6789'.
lv_scale = rescale( val = lv_scale1 dec = 2 mode = CL_ABAP_MATH=>ROUND_DOWN ).
WRITE:/ lv_scale.
lv_scale = rescale( val = lv_scale1 prec = 6 mode = CL_ABAP_MATH=>ROUND_DOWN ).
WRITE:/ lv_scale.
ENDFORM.
3. String Functions
示例:
"String Functions
FORM f_pre_functions_string.
"charlen, dbmaxlen, numofchar, strlen
"字符串长度
DATA:lv_str TYPE string VALUE 'hello world'.
DATA:lv_str1 TYPE C LENGTH 10 VALUE '你好'.
DATA:lv_len TYPE I.
"返回第一个字符长度,1字节字符返回1,占2字节字符返回2
lv_len = charlen( lv_str ).
WRITE:/ lv_len.
lv_len = charlen( lv_str1 ).
WRITE:/ lv_len.
"返回string类型最大长度,sstring,rawstring
"Type Group:abap中,abap_max_db_string_ln or abap_max_db_rawstring_ln
"se11->type group中查看
lv_len = dbmaxlen( lv_str ).
WRITE:/ lv_len.
"返回字符串长度
"区别:
"non-Unicode,a character that uses two bytes is only counted once.
lv_len = numofchar( lv_str ).
WRITE:/ lv_len.
"non-Unicode,a character that uses two bytes is only counted twice.
lv_len = strlen( lv_str ).
WRITE:/ lv_len.
"char_off
"语法:char_off( val = text add = pos [off = off] )
"返回指定偏移量1相距pos字符位置
lv_len = char_off( val = lv_str add = 2 off = 1 ).
WRITE:/ lv_len.
"cmax, cmin
"语法:cmax|cmin( val1 = text1 val2 = text2 [val3 = text3] ... [val9 = text9] )
"返回字符串比较最大最小值
DATA:lv_text1 TYPE C LENGTH 10 VALUE 'ABC'.
DATA:lv_text2 TYPE N LENGTH 10 VALUE '113'.
DATA:lv_text3 TYPE string VALUE 'hello'.
DATA:lv_text4 TYPE string VALUE '您好'.
DATA:lv_text TYPE string.
lv_text = cmax( val1 = lv_text1 val2 = lv_text2 val3 = lv_text3 val4 = lv_text4 ).
WRITE:/ lv_text.
lv_text = cmin( val1 = lv_text1 val2 = lv_text2 val3 = lv_text3 val4 = lv_text4 ).
WRITE:/ lv_text.
"count, count_any_of, count_any_not_of
"语法:count( val = text {sub = substring}|{regex = regex} [case = case]
"[off = off] [len = len] )
"语法:count_any_of( val = text sub = substring
"[off = off] [len = len] )
"语法:count_any_not_of( val = text sub = substring
"[off = off] [len = len] )
"统计子字符串出现次数
DATA:lv_count TYPE string VALUE 'hello world,welcome'.
DATA:lv_count1 TYPE string VALUE 'he'.
DATA:lv_count_num TYPE I.
"子串整体比较
lv_count_num = count(
val = lv_count
sub = lv_count1
case = 'X'
off = 0
len = strlen( lv_count ) ).
WRITE:/ lv_count_num.
"每个字符单个统计
lv_count_num = count_any_of(
val = lv_count
sub = lv_count1
off = 0
len = strlen( lv_count ) ).
WRITE:/ lv_count_num.
"每个字符单个不匹配统计
lv_count_num = count_any_not_of(
val = lv_count
sub = lv_count1
off = 0
len = strlen( lv_count ) ).
WRITE:/ lv_count_num.
"distance
"语法:distance( val1 = text1 val2 = text2 [max = max] )
"返回两个字符串Levenshtein distance
"编辑距离,两个字符串通过添加,删除,移动变成相同字符串
"编辑距离越小,越相似
DATA:lv_dis TYPE string VALUE 'if'.
DATA:lv_dis1 TYPE string VALUE 'iff'.
DATA:lv_dis_num TYPE I.
"设置max,当编辑距离大于max,返回max
lv_dis_num = distance( val1 = lv_dis val2 = lv_dis1 ).
WRITE:/ lv_dis_num.
"condense
"语法:condense( [val =] text [del = del] [from = from] [to = to] )
"去掉开始、结尾del中指定字符
DATA:lv_cond TYPE string.
DATA:lv_cond1 TYPE string VALUE 'xxxwelcomexxx'.
"返回elcome
lv_cond = condense( val = lv_cond1 del = 'xw' ).
WRITE:/ lv_cond.
"将from字符串替换为to指定字符串
lv_cond = condense( val = lv_cond1 del = 'x' from = 'wel' to = '' ).
WRITE:/ lv_cond.
"concat_lines_of
"语法:concat_lines_of( [table =] itab [sep = sep] )
TYPES:c80 TYPE C LENGTH 80.
DATA:lt_c TYPE TABLE OF c80.
DATA:ls_c LIKE LINE OF lt_c.
DATA:lv_concat TYPE string.
ls_c = 'hello'.
APPEND ls_c TO lt_c.
ls_c = 'world'.
APPEND ls_c TO lt_c.
lv_concat = concat_lines_of( table = lt_c sep = '&' ).
WRITE:/ lv_concat.
"escape
"语法:escape( val = text format = format )
"format: CL_ABAP_FORMAT类中"E_xxx"
"在不同格式化语言中,特殊字符转换
"XML,HTML,JS,URL等
DATA:lv_escape TYPE string.
DATA:lv_escape1 TYPE string VALUE '& < > " '' TAB LF CR BS FF \ ctrl-char '.
lv_escape = escape( val = lv_escape1 format = CL_ABAP_FORMAT=>E_XML_TEXT ).
WRITE:/ lv_escape.
lv_escape = escape( val = lv_escape1 format = CL_ABAP_FORMAT=>E_XML_ATTR ).
WRITE:/ lv_escape.
lv_escape = escape( val = lv_escape1 format = CL_ABAP_FORMAT=>E_URL ).
WRITE:/ lv_escape.
"find, find_end, find_any_of, find_any_not_of
"语法:find( val = text {sub = substring}|{regex = regex} [case = case]
"[off = off] [len = len] [occ = occ] )
"find_end( val = text regex = regex [case = case]
"[off = off] [len = len] [occ = occ] )
"find_any_of( val = text sub = substring
"[off = off] [len = len] [occ = occ] )
"find_any_not_of( val = text sub = substring
"[off = off] [len = len] [occ = occ] )
DATA:lv_find TYPE string VALUE 'hello world,welcome'.
DATA:lv_find1 TYPE string VALUE 'wo'.
DATA:lv_find_num TYPE I.
"查找指定子串,返回子串开始所在偏移量
"case 是否大小写敏感,off 匹配开始位置 len 比较长度,occ 匹配次数
"occ正数,从左到右;occ负数,从右到左
lv_find_num = find(
val = lv_find
sub = lv_find1
case = 'X'
off = 0
len = strlen( lv_find )
occ = 1 ).
WRITE:/ lv_find_num.
"查找指定子串,返回子串结束所在偏移量
lv_find_num = find_end(
val = lv_find
sub = lv_find1
case = 'X'
off = 0
len = strlen( lv_find )
occ = 1 ).
WRITE:/ lv_find_num.
"大小写敏感
"返回属于子串字符的字符在字符串位置
lv_find_num = find_any_of(
val = lv_find
sub = lv_find1
off = 0
len = strlen( lv_find )
occ = 1 ).
WRITE:/ lv_find_num.
"返回不属于子串字符的字符在字符串位置
lv_find_num = find_any_not_of(
val = lv_find
sub = lv_find1
off = 0
len = strlen( lv_find )
occ = 1 ).
WRITE:/ lv_find_num.
"insert
"语法:insert( val = text sub = substring [off = off] )
"插入子字符串
DATA:lv_insert TYPE string VALUE 'hello'.
DATA:lv_insert1 TYPE string VALUE 'head:'.
lv_insert = insert( val = lv_insert sub = lv_insert1 off = 0 ).
"head:hello
WRITE:/ lv_insert.
"match
"match( val = text regex = regex [case = case] [occ = occ] )
"返回匹配正则表达式的字符子串
"repeat
"语法:repeat( val = text occ = occ )
"返回重复字符串
DATA:lv_repeat TYPE string.
DATA:lv_repeat1 TYPE string VALUE 'hello'.
lv_repeat = repeat( val = lv_repeat1 occ = 5 ).
WRITE:/ lv_repeat.
"replace
"语法:replace( val = text [off = off] [len = len] with = new )
"语法:replace( val = text {sub = substring}|{regex = regex}
"with = new [case = case] [occ = occ] )
"字符串替换
DATA:lv_replace TYPE string VALUE 'hello,world,welcome'.
DATA:lv_replace1 TYPE string VALUE 'hi'.
lv_replace = replace( val = lv_replace off = 0 len = 5 with = lv_replace1 ).
WRITE:/ lv_replace.
lv_replace = replace( val = lv_replace sub = 'welcome' with = 'nice job' ).
WRITE:/ lv_replace.
"reverse
"reverse( [val =] text )
"字符串逆转
DATA:lv_reverse TYPE string VALUE 'abc'.
lv_reverse = reverse( val = lv_reverse ).
WRITE:/ lv_reverse.
"segment
"语法:segment( val = text index = idx [sep|space = sep] )
"使用sep分割字符串,返回指定部分分割子串
DATA:lv_segment TYPE string VALUE 'AB;CD;EF'.
"分割成AB CD EF三部分,返回CD第二部分
lv_segment = segment( val = lv_segment index = 2 sep = ';' ).
WRITE:/ lv_segment.
"shift_left, shift_right
"语法:shift_left( [val =] text
"[places = places]|[circular = places]|[sub = substring] )
"shift_right( [val =] text
"[places = places]|[circular = places]|[sub = substring] )
"可以只有val一个参数,将左边或右边空格移除
DATA:lv_shift TYPE string.
lv_shift = ' well '.
lv_shift = shift_left( lv_shift ).
WRITE:/ lv_shift.
"places
lv_shift = ' good day '.
lv_shift = shift_left( val = lv_shift places = 5 ).
WRITE:/ lv_shift.
"circular,循环
lv_shift = ' good day '.
lv_shift = shift_left( val = lv_shift circular = 5 ).
WRITE:/ lv_shift.
"sub,左边或右边所有与子串匹配字符串左移
lv_shift = ' good day '.
lv_shift = shift_left( val = lv_shift sub = ' good' ).
WRITE:/ lv_shift.
"substring, substring_after, substring_from, substring_before, substring_to
"语法:
"substring( val = text [off = off] [len = len] )
"substring_from( val = text {sub = substring}|{regex = regex}
"[case = case] [occ = occ] [len = len] )
"substring_after( val = text {sub = substring}|{regex = regex}
"[case = case] [occ = occ] [len = len] )
"substring_before( val = text {sub = substring}|{regex = regex}
"[case = case] [occ = occ] [len = len] )
"substring_to( val = text {sub = substring}|{regex = regex}
"[case = case] [occ = occ] [len = len] )
DATA:lv_substring TYPE string.
DATA:lv_substring1 TYPE string VALUE 'test,hello,world'.
lv_substring = substring( val = lv_substring1 off = 5 len = 5 ).
WRITE:/ lv_substring.
"substring_from,case,大小写敏感;sub 匹配子串; occ 第几次匹配; len,返回字符串长度
"返回ello 第二个e匹配后字符串,长度为4,包含e
lv_substring = substring_from( val = lv_substring1 sub = 'e' occ = 2 len = 4 ).
WRITE:/ lv_substring.
"返回llo, 第二个e匹配后字符串,长度为4,不包含e
lv_substring = substring_after( val = lv_substring1 sub = 'e' occ = 2 len = 4 ).
WRITE:/ lv_substring.
"返回st,h 第二个e匹配之前字符串,长度为4,不包含e
lv_substring = substring_before( val = lv_substring1 sub = 'e' occ = 2 len = 4 ).
WRITE:/ lv_substring.
"返回t,he 第二个e匹配之前字符串,长度为4,包含e
lv_substring = substring_to( val = lv_substring1 sub = 'e' occ = 2 len = 4 ).
WRITE:/ lv_substring.
"to_upper, to_lower, to_mixed, from_mixed
"语法:
"to_upper( [val =] text )
"to_lower( [val =] text )
"to_mixed( [val =] text [sep = sep] [case = case] [min = min] )
"from_mixed( [val =] text [sep = sep] [case = case] [min = min] )
DATA:lv_upper TYPE string VALUE 'ABcdefg'.
DATA:lv_lower TYPE string VALUE 'ABedFG你'.
"字符转换为大小写
lv_upper = to_upper( lv_upper ).
lv_lower = to_lower( lv_lower ).
WRITE:/ lv_upper,lv_lower.
"奇怪的函数
DATA:lv_mixed TYPE string VALUE 'my home well'.
"将首字母大写,将sep指定字符删除,将后一字符大写
lv_mixed = to_mixed( val = lv_mixed sep = 'O' case = 'X' min = 2 ).
WRITE:/ lv_mixed.
lv_mixed = 'MY HOME well'.
"mOy OhOoOmOe well
lv_mixed = from_mixed( val = lv_mixed sep = 'O' case = 'x' min = 1 ).
WRITE:/ lv_mixed.
"translate
"语法:translate( val = text from = from to = to )
"将text中所有from子串,替换成to子串
DATA:lv_trans TYPE string.
lv_trans = '----!hello!---'.
lv_trans = translate( val = lv_trans from = '-' to = '' ).
WRITE:/ lv_trans.
ENDFORM.
4.Byte Functions
示例:
FORM f_pre_functions_byte.
"xstrlen
"语法:xstrlen( arg )
"返回字节长度
DATA:lv_xstr TYPE xstring VALUE 'FF00EE'.
DATA:lv_len TYPE I.
lv_len = xstrlen( lv_xstr ).
WRITE:/ lv_len.
"bit-set
"语法:bit-set( arg )
"返回xstring
"1->80 2->40 3->20 4->10 5->08 6->04 ,怎么转换的?
lv_xstr = bit-set( 6 ).
WRITE:/ lv_xstr.
ENDFORM.
5.Table Functions
示例:
"table functions
FORM f_pre_functions_table.
"非常常用
"语法:lines( arg )
"内表行数
DATA:lt_tab TYPE TABLE OF spfli.
DATA:lv_line TYPE I.
SELECT * INTO TABLE lt_tab FROM spfli.
lv_line = lines( lt_tab ).
WRITE:/ lv_line.
ENDFORM.