字符串加法(判断序列号是否连续)

本文介绍了一种在35进制字符集中模拟字符串加法的方法,字符集包括0-9及A-Z,通过特定规则实现字符串的进位加法运算。适用于序列号生成等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 字符串不能整体做加法 但是我们可以模拟加法
字符集就是 0 1 2 3 4 5 6 7 8 9 A B C D E F G …… Z (按顺序排列)
你可以认为这是一个35进制的数字
然后在最后1位+1 如果不是Z 就得到后一位数字
(比如 2 + 1 = 3,9 + 1 = A ,X + 1 = Y,Y + 1 = Z 我相信你们要求的相邻也是这样的顺序)
如果最后一位是Z , 那+1就等于 0了, 往前1位加一 (做进位)
规则也是这样的,把进位做完了以后,这个字符串的+1操作就结束了。 

*&---------------------------------------------------------------------*
*& Report  ZIAN01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zian01.


TYPE-POOLS:slis.

PERFORM getdata.

*&---------------------------------------------------------------------*
*&      Form  getdata
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM getdata.
  DATA:BEGIN OF line,
    sernr LIKE objk-sernr,
    END OF line.
  DATA:itab LIKE TABLE OF line WITH HEADER LINE.
  line-sernr '12348'.
  APPEND line TO itab.
  line-sernr '12350'.
  APPEND line TO itab.
  line-sernr '12351'.
  APPEND line TO itab.
  line-sernr '12352'.
  APPEND line TO itab.
  line-sernr '12356'.
  APPEND line TO itab.
  line-sernr '12357'.
  APPEND line TO itab.
  line-sernr '12358'.
  APPEND line TO itab.
  line-sernr '12360'.
  APPEND line TO itab.
  line-sernr '12361'.
  APPEND line TO itab.

  DATA:s_sernr TYPE string.
  DATA:n1 TYPE i.
  n1 0.
sort itab by sernr.
  LOOP AT itab.
    DATATYPE ilen TYPE i.
    DATAs_forward TYPE i.
    1.
    len 0.
    s_forward 1.
    DATA:serialitem TYPE string.
    DATA:nextserial TYPE string.
    DATA:flag TYPE i.
    flag 0.
    serialitem itab-sernr.


    DATAs1 TYPE strings2 TYPE string.
    DATAitablen TYPE i.
    itablen linesitab ).

    IF itablen 1.
      s_sernr serialitem.   "只有一条序列号
    ENDIF.
    IF itablen > 1.   "有多个序列号
      IF n1 AND serialitem nextserial.  "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号相等
        s1 s2.
      ENDIF.
      IF n1 AND serialitem <> nextserial.  "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号不相等
        s1 serialitem.
        CONCATENATE s_sernr s2  INTO s_sernr.
      ENDIF.
      IF n1 > AND serialitem <> nextserial AND n1 <> itablen 1"循环到第二个序列号后面的序列号,并且当前序列号和上个序列号算出来的下个序列号不等并且不是最后一个序列号
        CONCATENATE s_sernr ','  s1 '-' s2 INTO s_sernr.
        s1 serialitem.
      ENDIF.
      IF n1 itablen AND serialitem nextserial."如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号相等
        s2 serialitem.
        CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr.
      ENDIF.
      IF n1 itablen AND serialitem <> nextserial."如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号不相等
        CONCATENATE s_sernr ',' s1 '-' s2 ',' serialitem INTO s_sernr.
      ENDIF.
    ENDIF.

    "判断字符串是不是全是‘Z'',如果全是'Z'进位1
    len strlenserialitem ).
    DATA:zflag TYPE iTYPE izchar TYPE c.
    DATAzstring TYPE string.
    zstring ''.
    zflag 0.
    t 0.
    WHILE t < len.
      zchar serialitem+t(1).
      CONCATENATE zstring 'Z' INTO zstring.
      t t + 1.
    ENDWHILE.

    IF zstring serialitem"如果字符串是全'Z',则进位1,后补0
      t 0.
      zstring '1'.
      WHILE t < len.
        CONCATENATE zstring '0' INTO zstring.
        t t + 1.
      ENDWHILE.
      nextserial =  zstring.
    ENDIF.

    WHILE  <= len  AND s_forward 1.
      DATA:strstart TYPE stringstrmid TYPE stringstrend TYPE string.
      DATA:endchar TYPE c.
      DATA:point TYPE ip1 TYPE iTYPE i.
      point len i.
      p1 point + 1.
      n 1.
      endchar serialitem+point(1).
      IF endchar <> 'Z'.   "如果字符不为’Z‘’
        s_forward 0.   "s_forward为0则不进行while循环了
        strstart serialitem+0(point).
        IF flag 0.          "flag为0表示不需要进位加 1
          strend serialitem+p1(n).
          CASE endchar.
            WHEN '0'.
              CONCATENATE strstart '1' strend INTO nextserial.
            WHEN '1'.
              CONCATENATE strstart '2' strend INTO nextserial.
            WHEN '2'.
              CONCATENATE strstart '3' strend INTO nextserial.
            WHEN '3'.
              CONCATENATE strstart '4' strend INTO nextserial.
            WHEN '4'.
              CONCATENATE strstart '5' strend INTO nextserial.
            WHEN '5'.
              CONCATENATE strstart '6' strend INTO nextserial.
            WHEN '6'.
              CONCATENATE strstart '7' strend INTO nextserial.
            WHEN '7'.
              CONCATENATE strstart '8' strend INTO nextserial.
            WHEN '8'.
              CONCATENATE strstart '9' strend INTO nextserial.
            WHEN '9'.
              CONCATENATE strstart 'A' strend INTO nextserial.
            WHEN 'A'.
              CONCATENATE strstart 'B' strend INTO nextserial.
            WHEN 'B'.
              CONCATENATE strstart 'C' strend INTO nextserial.
            WHEN 'C'.
              CONCATENATE strstart 'D' strend INTO nextserial.
            WHEN 'D'.
              CONCATENATE strstart 'E' strend INTO nextserial.
            WHEN 'E'.
              CONCATENATE strstart 'F' strend INTO nextserial.
            WHEN 'F'.
              CONCATENATE strstart 'G' strend INTO nextserial.
            WHEN 'G'.
              CONCATENATE strstart 'H' strend INTO nextserial.
            WHEN 'H'.
              CONCATENATE strstart 'I' strend INTO nextserial.
            WHEN 'I'.
              CONCATENATE strstart 'J' strend INTO nextserial.
            WHEN 'J'.
              CONCATENATE strstart 'K' strend INTO nextserial.
            WHEN 'K'.
              CONCATENATE strstart 'L' strend INTO nextserial.
            WHEN 'L'.
              CONCATENATE strstart 'M' strend INTO nextserial.
            WHEN 'M'.
              CONCATENATE strstart 'N' strend INTO nextserial.
            WHEN 'N'.
              CONCATENATE strstart 'O' strend INTO nextserial.
            WHEN 'O'.
              CONCATENATE strstart 'P' strend INTO nextserial.
            WHEN 'P'.
              CONCATENATE strstart 'Q' strend INTO nextserial.
            WHEN 'Q'.
              CONCATENATE strstart 'R' strend INTO nextserial.
            WHEN 'R'.
              CONCATENATE strstart 'S' strend INTO nextserial.
            WHEN 'S'.
              CONCATENATE strstart 'T' strend INTO nextserial.
            WHEN 'T'.
              CONCATENATE strstart 'U' strend INTO nextserial.
            WHEN 'U'.
              CONCATENATE strstart 'V' strend INTO nextserial.
            WHEN 'V'.
              CONCATENATE strstart 'W' strend INTO nextserial.
            WHEN 'W'.
              CONCATENATE strstart 'X' strend INTO nextserial.
            WHEN 'X'.
              CONCATENATE strstart 'Y' strend INTO nextserial.
            WHEN 'Y'.
              CONCATENATE strstart 'Z' strend INTO nextserial.
          ENDCASE.
        ELSE.        "flag为 1 需要进位加 1 ,如123Z 进位变为1240
          DATA:TYPE i.
          0.
          WHILE 1.
            CONCATENATE strend '0' INTO strend.
            1.
          ENDWHILE.

          CASE endchar.
            WHEN '0'.
              CONCATENATE strstart '1' strend INTO nextserial.
            WHEN '1'.
              CONCATENATE strstart '2' strend INTO nextserial.
            WHEN '2'.
              CONCATENATE strstart '3' strend INTO nextserial.
            WHEN '3'.
              CONCATENATE strstart '4' strend INTO nextserial.
            WHEN '4'.
              CONCATENATE strstart '5' strend INTO nextserial.
            WHEN '5'.
              CONCATENATE strstart '6' strend INTO nextserial.
            WHEN '6'.
              CONCATENATE strstart '7' strend INTO nextserial.
            WHEN '7'.
              CONCATENATE strstart '8' strend INTO nextserial.
            WHEN '8'.
              CONCATENATE strstart '9' strend INTO nextserial.
            WHEN '9'.
              CONCATENATE strstart 'A' strend INTO nextserial.
            WHEN 'A'.
              CONCATENATE strstart 'B' strend INTO nextserial.
            WHEN 'B'.
              CONCATENATE strstart 'C' strend INTO nextserial.
            WHEN 'C'.
              CONCATENATE strstart 'D' strend INTO nextserial.
            WHEN 'D'.
              CONCATENATE strstart 'E' strend INTO nextserial.
            WHEN 'E'.
              CONCATENATE strstart 'F' strend INTO nextserial.
            WHEN 'F'.
              CONCATENATE strstart 'G' strend INTO nextserial.
            WHEN 'G'.
              CONCATENATE strstart 'H' strend INTO nextserial.
            WHEN 'H'.
              CONCATENATE strstart 'I' strend INTO nextserial.
            WHEN 'I'.
              CONCATENATE strstart 'J' strend INTO nextserial.
            WHEN 'J'.
              CONCATENATE strstart 'K' strend INTO nextserial.
            WHEN 'K'.
              CONCATENATE strstart 'L' strend INTO nextserial.
            WHEN 'L'.
              CONCATENATE strstart 'M' strend INTO nextserial.
            WHEN 'M'.
              CONCATENATE strstart 'N' strend INTO nextserial.
            WHEN 'N'.
              CONCATENATE strstart 'O' strend INTO nextserial.
            WHEN 'O'.
              CONCATENATE strstart 'P' strend INTO nextserial.
            WHEN 'P'.
              CONCATENATE strstart 'Q' strend INTO nextserial.
            WHEN 'Q'.
              CONCATENATE strstart 'R' strend INTO nextserial.
            WHEN 'R'.
              CONCATENATE strstart 'S' strend INTO nextserial.
            WHEN 'S'.
              CONCATENATE strstart 'T' strend INTO nextserial.
            WHEN 'T'.
              CONCATENATE strstart 'U' strend INTO nextserial.
            WHEN 'U'.
              CONCATENATE strstart 'V' strend INTO nextserial.
            WHEN 'V'.
              CONCATENATE strstart 'W' strend INTO nextserial.
            WHEN 'W'.
              CONCATENATE strstart 'X' strend INTO nextserial.
            WHEN 'X'.
              CONCATENATE strstart 'Y' strend INTO nextserial.
            WHEN 'Y'.
              CONCATENATE strstart 'Z' strend INTO nextserial.
          ENDCASE.
        ENDIF.
      ELSE.
        s_forward 1.   "有 'Z''字符需要查找前一个字符
        flag 1.
      ENDIF.
      i  1.
    ENDWHILE.
    s2 serialitem.
    n1 n1 + 1.
  ENDLOOP.

  SHIFT s_sernr LEFT DELETING LEADING ','.
  WRITE:'s_sernr' ,s_sernr.
ENDFORM.                    "getdata*&---------------------------------------------------------------------*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值