ABAP 实现字母运算

导语:最近在利用abap2xls做excel的导出,不同的是需要动态计算有多少列,分别把数据指定到ABCDE列当中去,所以有需求对字母进行递增递减的计算,例如:A+1=C   Z+1=AA,

一、原理

原理是利用字母对应的unicode编码,A-Z的unicode的编码是65-99,先将字母转换成unicode编码进行数学运算并进行2位数的同步进位,再根据得到的unicode编码拆分转换为字母,再拼接到一起,具体代码和测试结果如下。

二、代码示例

这里封装到Henry的工具箱中

  METHOD letter_calculation.

    "实现字母加减 (EXCEL使用 最多支持999列)
    DATA : lv_single   TYPE i,
           lv_ten      TYPE i,
           lv_hundreds TYPE i,
           lv_strlen   TYPE i.

    DATA : lv_single_cal   TYPE i,
           lv_ten_cal      TYPE i,
           lv_hundreds_cal TYPE i.

    DATA : lv_letter TYPE char3.
    lv_letter = iv_letter.

    "计算输入字母的长度
    lv_strlen = strlen( lv_letter ).

    CASE lv_strlen.
      WHEN '1'.
        lv_letter = |  { lv_letter }|.
      WHEN '2'.
        lv_letter = | { lv_letter }|.
      WHEN OTHERS.
    ENDCASE.

    "识别每一位的unicode编码
    IF lv_letter+2(1) IS NOT INITIAL.
      lv_single   =  cl_abap_conv_out_ce=>uccpi( CONV #( lv_letter+2(1) ) ).
    ENDIF.

    IF lv_letter+1(1) IS NOT INITIAL.
      lv_ten      =  cl_abap_conv_out_ce=>uccpi( CONV #( lv_letter+1(1) ) ).
    ELSE.
      lv_ten = 64.
    ENDIF.

    IF lv_letter(1) IS NOT INITIAL.
      lv_hundreds =  cl_abap_conv_out_ce=>uccpi( CONV #( lv_letter(1) ) ).
    ELSE.
      lv_hundreds = 64.
    ENDIF.

    "识别每一位增加了几位
    lv_single_cal   = iv_numc MOD 26.
    lv_ten_cal      = iv_numc DIV 26.
    lv_hundreds_cal = iv_numc DIV 26 DIV 26.


    CASE iv_sign.
      WHEN '+'.

        lv_single = lv_single + lv_single_cal.
        IF lv_single > 90. "如果超过Z 要进一位
          lv_single = lv_single - 90 + 65 - 1.
          lv_ten_cal = lv_ten_cal + 1.
        ENDIF.

        lv_ten = lv_ten + lv_ten_cal.
        IF lv_ten > 90 .
          lv_ten = lv_ten - 90 + 65 - 1.
          lv_hundreds_cal = lv_hundreds_cal + 1.
        ENDIF.

        lv_hundreds = lv_hundreds_cal + lv_hundreds.
      WHEN '-'.
        "lv_single = lv_single - lv_hundreds_cal * 10000 - lv_ten_cal * 100 - lv_single_cal.
    ENDCASE.

    IF lv_hundreds > 90 or lv_single < 65.
      EXIT.
    ENDIF.

    IF lv_hundreds < 65.
      CLEAR lv_hundreds.
    ENDIF.

    IF lv_ten < 65.
      CLEAR lv_ten.
    ENDIF.

    IF lv_single IS NOT INITIAL.
      ev_letter+2(1) =  cl_abap_conv_in_ce=>uccpi( CONV #( lv_single ) ).
    ENDIF.

    IF lv_ten IS NOT INITIAL.
      ev_letter+1(1) =  cl_abap_conv_in_ce=>uccpi( CONV #( lv_ten ) ).
    ENDIF.

    IF lv_hundreds IS NOT INITIAL.
      ev_letter(1) =  cl_abap_conv_in_ce=>uccpi( CONV #( lv_hundreds ) ).
    ENDIF.


    CONDENSE ev_letter.



  ENDMETHOD.

三、测试结果

计算应该结果同Excel的列一样,A+3=D,AZ+3=BC

作者:小飞猪猪猪猪猪猪猪–CSDN

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞猪猪猪猪猪猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值