【SAP】 ABAP 字符串处理

  • 去除前导零
    DATA lv_char1 TYPE c LENGTH 10.
    lv_char1 = '0000021211'.
    **********************************************************************方式1 使用shift
    SHIFT lv_char1 LEFT DELETING LEADING '0'.
    write:/ lv_char1.
    **********************************************************************方式2 使用CONVERSION_EXIT_ALPHA_OUTPUT
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
         EXPORTING
       input  = lv_char1
         IMPORTING
       output = lv_char1.
    WRITE:/ lv_char1.
    **********************************************************************方式3 使用表达式
    lv_char1 = |{ lv_char1 ALPHA = out }|.
    WRITE:/ lv_char1.
    
  • 新增前导零
    DATA lv_char1 TYPE c LENGTH 10.
    lv_char1 = '0000021211'.
    DATA lv_char1 TYPE c LENGTH 10.
    lv_char1 = '21211'.
    WRITE:/ lv_char1.
    **********************************************************************方式1 CONVERSION_EXIT_ALPHA_INPUT
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
       EXPORTING
        input  = lv_char1
       IMPORTING
        output = lv_char1.
    WRITE:/ lv_char1.
    **********************************************************************方式2 
    lv_char1 = |{ lv_char1 ALPHA = IN }|.
    WRITE:/ lv_char1.
    
  • 拆分字符串 SPLIT
    • split 将字符传dobj按照特定字符sep进行拆分
      SPLIT dobj AT sep INTO { {result1 result2 [...]} | {TABLE result_tab} }  [IN {CHARACTER|BYTE} MODE]. 
      
  • 截取字符串 SHIFT
    • shift dobj up to substr [mode]
      查找字符串中substr的位置,并向左截取或者向右截取字符串
    • shift dobj [by n places] [mode] mode可以为left和right
      字符串向左或者向右移动n个字符,如果n大于字符串的长度,则结果为空值
    • shift dobj { {LEFT DELETING LEADING} | {RIGHT DELETING TRAILING} } str
      把字符串中前的(LEFT)或者后的(RIGHT)的字符str都去掉
  • 字符替换 REPLACE
    • 关键字写法
      • replace oldStr in fullStr with newStr 默认是只替换匹配到的第一个字符
      • replace [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] oldSubStr in fullString with newSubStr.
      • REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new [IN {CHARACTER|BYTE} MODE].
      • REPLACE {str1} WITH {str2} INTO {c} [LENGTH {l}] 该写法已过时
      • 实例代码
        data lv_str type string.
        data:lv_chr1 type c LENGTH 100,
        lv_chr2 type c length 100.
        			  
        lv_chr2 = '13%-一般产品-腾讯云服务'.
        replace  '-' in lv_chr2 with ''.
        write:/ lv_chr2.  "13%一般产品-腾讯云服务
        lv_chr2 = '13%-一般产品-腾讯云服务'.
        replace all occurrences of '-' in lv_chr2 with ''.
        write:/ lv_chr2. "13%一般产品腾讯云服务
        replace section offset 3 length 4 of lv_chr2 with 'test'.
        write:/ lv_chr2. "13%test腾讯云服务
        
    • 函数写法
      • 可以在部分操作位中使用,减少中间变量的使用
      • replace( val = text [off = off] [len = len] with = new )
      • replace(val = text {sub = substring}|{regex = regex} with = new [case = case] [occ = occ] )
      • 实例代码:
        lv_chr2 = '13%-一般产品-技术'.
        *replace section offset 3 length 4 of lv_chr2 with 'test'.
        write:/ replace( val = lv_chr2
        		   off = 3
        		   len = 4
        		   with = 'test'). "13%test技术
        			  
        lv_chr2 = '13%-一般产品-技术'.
        *replace all occurrences of '-' in lv_chr2 with ''.
        write:/ replace( val = lv_chr2
        		   sub = '-'
        		   with = ''
                         occ = 0 )."13%一般产品技术 occ 可以是正数也可以为负数,0标识全部替换
        
  • 大小写转换
    • 函数写法
      • to_upper(string)
      • to_lower(string)
    • 关键字写法
      • translate str to {UPPER|LOWER} CASE
    • 实例代码
      		  lv_chr1 = 'abc001'.
      		  translate lv_chr1 to upper case.
      		  write:/ lv_chr1.
      		  write:/ to_lower( lv_chr1 ).
      		  translate lv_chr1 to lower case.
      		  write:/ lv_chr1.
      		  write:/ to_upper( lv_chr1 ).
      
  • 拼接字符串
    • 关键字 CONCATENATE
      • CONCATENATE {dobj1 dobj2 ...}|{LINES OF itab} INTO result [IN {CHARACTER|BYTE} MODE] [SEPARATED BY sep] [RESPECTING BLANKS].
    • &&字符
    • 字符串模板
    • 区别
      • 使用concatenate 会忽略 需要拼接字符串的尾部空格
      • 使用字符串操作符会忽略所拼接字符串的尾部空格,被拼接的第二个字符串头部如果有多个空格,则会合并成一个
      • 使用字符串模板则会去除所有拼接字符的尾部空格
    • 实例代码
      		  data lv_str type string.
      		  data:lv_chr1 type c LENGTH 100,
      		       lv_chr2 type c length 100.
      		  
      		  lv_chr1 = '  abba  '.
      		  lv_chr2 = '  dfsf  '.
      		  
      		  CONCATENATE lv_chr1 lv_chr2 into data(lv_chr3) separated by ': '.
      		  write:/ lv_chr3.
      		  lv_chr3 = lv_chr1 && ': ' && lv_chr2.
      		  write:/ lv_chr3.
      		  write:/ |{ lv_chr1 }:{ lv_chr2 }|.
      
  • 压缩字符
    • 关键字 CONDENSE
      • condense string [no-gaps]. 没有no-gaps时,会将首尾的空格移除并将字符串中间的多个空格压缩成1个,如果使用了no-gaps则删除所有空格。
    • 函数 CONDENSE
      • condense( [val =] text [del = del] [from = from] [to = to] )
        如果del不为空,则字符串中已del开头和结尾的部分都会删除,如果为空,则不会有删除。
        如果from有值,则会将字符串中跟from值匹配的子字符替换为to的第一个字符。
        del、from、to 的默认值都是空格。
    • 实例代码
      		  data lv_str type string.
      		  data:lv_chr1 type c LENGTH 100,
      		       lv_chr2 type c length 100.
      		  lv_chr1 = '  ERROR\  处理出错  \  MSG  \错误  '.
      		  
      		  condense lv_chr1 .
      		  write:/ lv_chr1. "ERROR\ 处理出错 \ MSG \错误
      		  
      		  condense lv_chr1 no-gaps.
      		  write:/ lv_chr1. "ERROR\处理出错\MSG\错误
      		  
      		  lv_chr1 = '  ERROR\  处理出错  \  MSG  \错误  '.
      		  write:/ condense( lv_chr1 ). "ERROR\ 处理出错 \ MSG \错误
      		  
      		  write:/ condense( val = lv_chr1
      		                    to = ''). "ERROR\ 处理出错 \ MSG \错误
      		  
      		  write:/ condense( val = lv_chr1
      		                    from = 'ERROR'
      		                    to = 'ERR'). "E\ 处理出错 \ MSG \错误
      
  • 查找字符串
    • 函数FIND
    • 关键字 FIND
      • 语法
        			   FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern IN [SECTION [OFFSET off] [LENGTH len] OF] dobj [IN {CHARACTER|BYTE} MODE] [find_options]
        
      • substr 不能为空字符
      • find关键字的效率要高于操作符 cs
      • 关键字 serch 已经被标记为过时的写法
posted @   LingC_C  阅读(1666)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示