SAP ABAP 字符串内数字去前导零的两种方法(正则/拼接)

news/2024/9/21 20:21:45

碰到一个小需求,需要把字符串里数字的前导0给去掉。

ABAP内,想对字符串做处理,把字符串内的数字进行去前导0,通常有两种思路,拆分处理再拼接或者直接用正则表达替换。

最初的想法是直接通过符号拆分,去前导0后拼回去,但是了解到实际分割的符号并不唯一。

所以直接用正则表达式来做替换会更加合适。

通过0(\d)来去掉0,0(\d)代表的是0+数字,通过这个方法可以去掉一到两位数字的前导0

点击查看代码
WRITE:/,'*通过0(\d)来去掉0,0(\d)代表的是0+数字,通过这个方法可以去掉一到两位数字的前导0'.
DATA    text2   TYPE string VALUE '01,02,04;03,05,08;06,09,010,20,025'.
WRITE:/,'去前导0之前的字符串:',text2.
REPLACE ALL OCCURRENCES OF REGEX '0(\d)' IN text2 WITH '$1'.
WRITE:/,'去前导0之后的字符串:',text2.

效果图:

但是我发现,如果出现3位数字的情况,会出BUG,比如105直接替换成15了

点击查看代码
WRITE:/,'*但是当出现三位数时,0(\d)是什么效果呢?'.
DATA    text3   TYPE string VALUE '01,04,05;02,05,06;08,09,10,18;90,100,105,110'.
WRITE:/,'去前导0之前的字符串:',text3.
REPLACE ALL OCCURRENCES OF REGEX '0(\d)' IN text3 WITH '$1'.
WRITE:/,'去前导0之后的字符串:',text3.
WRITE:/,'*可以看到,三位数数字的0一样会被删掉'.

效果图:

为了避免出现可能会出现的三位数BUG,所以匹配的字符多一位,采用(\D)0(\d),非数字+0+数字来作为匹配。

但是这样就漏掉开头的第一个数字了,所以再加一步[1]+去字符开头的前导0。

点击查看代码
WRITE:/,'*为了适应字符串内存在三位数及以上的情况,增加一个匹配项变成(\D)0(\d),这代表的是非数字+0+数字'.
WRITE:/,'*但是这样就会漏掉开头第一个数字,因为缺少了非数字的匹配项,所以加一步^[0]+,去掉开头的前导0'.
DATA    text4   TYPE string VALUE '01,04,05;02,05,06;08,09,010,18;090,0100,0105,0110'.
WRITE:/,'去前导0之前的字符串:',text4.
REPLACE ALL OCCURRENCES OF REGEX '(\D)0(\d)' IN text4 WITH '$1$2'.
WRITE:/,'通过(\D)0(\d)去前导0的字符串:',text4.
REPLACE ALL OCCURRENCES OF REGEX '^[0]+'     IN text4 WITH ''.
WRITE:/,'再去掉开头的前导0的字符串',text4.

效果图:

那么如果不用正则替换,怎么用拼接的方式实现去掉字符串里的前导零呢?

假如间隔的符号是固定的,直接拆分去前导零做拼接就行了。

点击查看代码
DATA text0   TYPE string VALUE '01,02,04,03,05,08,06,09,10,15,20,30,50,105,120'.
DATA txt0    TYPE string.
DATA num0(2) TYPE c VALUE 0.WRITE:/,'*对固定符号间隔的字符串做处理,直接拆分做去前导0即可'.
WRITE:/,'去前导0之前的字符串:',text0.
*分割符号固定
*通过,分割放入内表
SPLIT text0 AT ',' INTO TABLE DATA(lt_text).*去前导0后重新拼接
LOOP AT lt_text ASSIGNING FIELD-SYMBOL(<lt_text>).<lt_text> = |{ <lt_text> ALPHA = OUT }|.txt0 = |{ txt0 }{ COND #( WHEN txt0 IS NOT INITIAL THEN ',' ELSE '') }{ CONV dec03( <lt_text> ) }|.ENDLOOP.
WRITE:/,'去前导0之后的字符串:' ,txt0.
效果图:


但是,分隔的符号出现多个时,SPLIT直接拆分就不太好用了。

首先用正则去掉数字,用拿到的分割符号给函数segment做拆分,再做拼接。

点击查看代码
DATA lt_asv   TYPE TABLE OF string .
DATA text1   TYPE string VALUE '01,02,04;03,05,08;06,09,10;15,20,30;50,105,120'.
DATA num1(3) TYPE c VALUE 0.
DATA num2(3) TYPE c VALUE 0.
DATA symbol  TYPE string.
DATA(text1_copy) = text1.WRITE:/,'*对非固定符号间隔的字符串做拆分就需要用到segment函数'.
*但是分割符号不固定怎么办呢
REPLACE ALL OCCURRENCES OF REGEX '[0-9]' IN text1_copy WITH ''.
WRITE:/,'去前导0之前的字符串:',text1.
WRITE:/,'得到所有用于分割的符号:' ,text1_copy.
WRITE:/,'*这串字符将作为segment函数的space入参'.DO.TRY.DATA(lv_data) = segment( val   = text1index = sy-indexspace = text1_copy ).CATCH cx_sy_strg_par_val.EXIT.ENDTRY.IF sy-subrc = 0.DATA:lt_data LIKE TABLE OF lv_data.APPEND lv_data TO lt_data.ENDIF.
ENDDO.clear text1.
LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<lt_data>).<lt_data> = |{ <lt_data> ALPHA = OUT }|.num1 =  sy-tabix - 2.text1 = |{ text1 }{ COND #( WHEN text1 IS NOT INITIAL THEN text1_copy+num1(1) ELSE '') }{ CONV dec03( <lt_data> ) }|.
ENDLOOP.WRITE:/,'去前导0之后的字符串:',text1.

效果图:


  1. 0 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/46850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

tcp 应用层协议选择

使用自建协议,还是grpc 等 在Go语言中使用gob(Go binary)进行数据传输时,是否需要使用gRPC(Google Remote Procedure Call)取决于你的具体需求和场景。两者并不相互依赖,但可以结合使用。下面是详细的解释: Gob Gob是Go语言自带的序列化和反序列化工具,它可以将Go的数…

使用nibabel 绘制模型

举例: 绘制一个正方体1 import matplotlib.pyplot as plt2 from mpl_toolkits.mplot3d import Axes3D3 import numpy as np4 import nibabel as nib5 6 # 创建一个图形对象7 fig = plt.figure()8 9 # 在图形中添加一个子图,参数为行数、列数和子图索引 10 ax = fig.add_subpl…

Tensorboard的使用

什么是Tensorboard 在训练过程中我们能希望看到训练的过程怎么样,这时候就可以使用这个模块来实现。他可以显示函数之间的变化过程。 Tensorboard的使用 Summarywriter类 这个类的作用是创建训练日志文件。 Summarywriter(“文件地址”)就可以在目录下生成训练的日志,这个日…

前端查询结果排序

效果图:流程:列名加两个箭头图片;点击下箭头,触发倒排序,点击上箭头触发正排序。 实现:列名上加两个图标,给图标加点击事件,form表单隐藏域加两个文本框存储排序和字段名,触发搜索事件,搜索结果按某个字段拍好序列。 优点:每次点击都是独立事件,不用存储上次结果,…

为什么 TCP 协议有粘包问题

来自:https://draveness.me/whys-the-design-tcp-message-frame/为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有…

在Ubuntu系统安装Anaconda及Python

本文介绍在Linux Ubuntu操作系统的电脑中,安装Anaconda环境与Python语言的方法~本文介绍在Linux Ubuntu操作系统的电脑中,安装Anaconda环境与Python语言的方法。在之前的文章Anaconda与Python环境在Windows中的部署中,我们介绍了在Win10电脑中,安装Anaconda环境与Python语言…

阅读mmdetection3d框架的源码探索其构建dataset的流程

在查看一些基于mmdetection3d构建的代码的时候,一开始会摸不着头脑,它的dataset到底是怎么构造的? 接下来就直接下载mmdetection3d这个仓库,然后去分析里面的代码。 可以看到config(比如mmdetection3d/configs/centerpoint/centerpoint_02pillar_second_secfpn_4x8_cyclic…

MBR40100PT-ASEMI智能AI用MBR40100PT

MBR40100PT-ASEMI智能AI用MBR40100PT编辑:ll MBR40100PT-ASEMI智能AI用MBR40100PT 型号:MBR40100PT 品牌:ASEMI 封装:TO-247 最大平均正向电流(IF):40A 最大循环峰值反向电压(VRRM):100V 最大正向电压(VF):0.82V~0.88V 工作温度:-40C~150C 反向恢复时间:5ns 芯片…