ABAP Help Document(10):3.3预定义Function

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.
posted @ 2021-04-21 21:25  渔歌晚唱  阅读(227)  评论(0编辑  收藏  举报