ABAP 中的前导零和尾零

前零和末尾零是指分别出现在数字序列中第一个非零数字之前和最后一个非零数字之后的任何零数字。

关于前导 0

在 SAP 系统中,大多数字母数字字段在数据库中存储时都带前导零,完全占用字段的定义长度。但是,当字段显示给最终用户时,前导零就被省略掉了。

SAP 通过使用所谓的转换出口将数值从外部(输出)格式转换为内部(输入)格式来处理这种数据规范化过程。

添加或删除前导零是 ABAP 开发人员日常生活中的常见要求。随着语法的不断发展,实现上述要求的可能性也越来越多。

转换退出示例

下面的示例使用的是订单号数据元素 AUFNR,其数据类型为 CHAR,长度为 12。

ABAP 复制代码
DATA(lv_order_number) = CONV aufnr( 12345 ).

在 ABAP 字典中打开我们要转换的字段域,就会发现我们可以使用 "ALPHA "转换例程。开发人员可以使用这些功能模块在大多数数字/ID 类型字段中添加和删除前导零。

ABAP 词典中的域 AUFNR (SE11):

函数模块

在过去,ALPHA 转换例程的功能模块是添加和删除零的最佳方法。

ABAP 复制代码
DATA(lv_order_number) = CONV aufnr( 12345 ).
WRITE |{ lv_order_number }|.    "Output: 12345

"Add leading zeros
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = lv_order_number
  IMPORTING
    output = lv_order_number.

WRITE |{ lv_order_number }|.    "Output: 000000012345

"Remove leading zeros
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
  EXPORTING
    input  = lv_order_number
  IMPORTING
    output = lv_order_number.

WRITE |{ lv_order_number }|.    "Output: 12345

使用字符串模板的简易形式

自从 ABAP 7.4 中的字符串模板和 ABAP 7.2 中的嵌入式 ALPHA 表达式出现后,ALPHA 转换的结果就可以在一行中实现。

ABAP 复制代码
DATA(lv_order_number) = CONV aufnr( 12345 ).
WRITE |{ lv_order_number }|.    "Output: 12345

lv_order_number =  |{ lv_order_number ALPHA = IN }|.
WRITE |{ lv_order_number }|.    "Output: 000000012345

lv_order_number =  |{ lv_order_number ALPHA = OUT }|.
WRITE |{ lv_order_number }|.    "Output: 12345

带构造函数运算符 CONV 的内联声明

我们甚至可以在一行中声明一个变量并填充前导零,这样就不需要可能的辅助变量了。

ABAP 复制代码
DATA(lv_order_number) = CONV aufnr( |{ '12345' ALPHA = IN }| ).
WRITE |{ lv_order_number }|.    "Output: 000000012345

其他例子

用 SHIFT 删除前导零

SHIFT 语句可用于删除零字符串。

ABAP 复制代码
DATA(lv_order_number) = CONV aufnr( |{ '12345' ALPHA = IN }| ).
WRITE |{ lv_order_number }|.    "Output: 000000012345

SHIFT lv_order_number LEFT DELETING LEADING '0'.
WRITE |{ lv_order_number }|.    "Output: 12345

用 OVERLAY 添加尾数零

OVERLAY 语句可用于为字符串填充尾部的零。

ABAP 复制代码
DATA(lv_order_number) = CONV aufnr( 12345 ).
WRITE |{ lv_order_number }|.    "Output: 12345

"Helper variable of type string, without any leading or trailing zeros
DATA(lv_order_number_string) =  |{ lv_order_number ALPHA = OUT }|.
OVERLAY lv_order_number_string WITH '000000000000'.
WRITE |{ lv_order_number_string }|.    "Output: 123450000000
相关推荐
嘻嘻嘻嘻嘻嘻ys12 分钟前
《Spring Boot 3 + GraalVM原生镜像实战:云原生时代的毫秒启动与性能调优》
前端·后端
嘻嘻嘻嘻嘻嘻ys15 分钟前
《Spring Boot 3.0×GraalVM:云原生时代的毫秒级启动实战革命》
前端·后端
嘻嘻嘻嘻嘻嘻ys17 分钟前
《Vue 3.4响应式内核优化与WebAssembly性能突破实战指南》
前端·后端
绵阳的脑内SSD18 分钟前
Redis 通用命令与keyspace
后端
极客智谷19 分钟前
Spring AI应用系列——基于DashScope平台的Chat应用
人工智能·后端
用户77853718369620 分钟前
小模型工具调用能力激活:以Qwen2.5 0.5B为例的Prompt工程实践
人工智能·后端
星辰大海的精灵30 分钟前
AI编码陷阱防不胜防看看 Cursor使用技巧
人工智能·后端
异常君34 分钟前
Nginx 架构深度剖析:多进程单线程模型与异步事件驱动
后端·nginx·架构
用户20311966009638 分钟前
空合并运算符
前端·后端
小奏技术1 小时前
开源项目看不懂?试试DeepWiki生成任意开源项目实时可对话文档
后端·openai