字符串长度及自动截取

abap 中对于字符串长度的计算一般用 strlen 函数实现。但此函数只能算出字符的个数无法计算字符串的长度,例如 'ABC你好'用此函数计算得到的值为5,显然它不是我们想要的,它的字节长度为7 。

   经过研究,我写了一个函数可以实现功能代码如下:


FUNCTION YGET_CNCHAR_CHARLE.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(STRING) TYPE  STRING 传入字符串
*"  EXPORTING 
*"     REFERENCE(STR) TYPE  STRING  返回字符串
*"     REFERENCE(CHARLEN) TYPE  I   返回长度
*"----------------------------------------------------------------------

DATA: w_uccp TYPE i,
w_temp(2) TYPE c,
w_left(100) TYPE c,
w_len(10) TYPE c,
s_len TYPE i
.
w_left = string.

DATA : BEGIN OF line,
       text TYPE c,
       END OF line,
       itab LIKE TABLE OF line WITH HEADER LINE.


*DATA str TYPE string.
DO.
  CALL FUNCTION 'TEXT_SPLIT'
    EXPORTING
      length = 2
      text   = w_left
    IMPORTING
      line   = w_temp
      rest   = w_left.

  CALL METHOD cl_abap_conv_out_ce=>uccpi
    EXPORTING
      char = w_temp
    RECEIVING
      uccp = w_uccp.
  w_len = STRLEN( w_temp ).
*  WRITE: /1 w_temp,
*  10 w_uccp,
*  25 w_len.
  IF w_uccp > 256.
    CONCATENATE str w_temp INTO str.
  ENDIF.
  IF w_left IS INITIAL OR sy-index > 100.
    EXIT.
  ENDIF.
ENDDO.
IF str IS NOT INITIAL.
  DATA:t_len TYPE i.
  clear :  s_len,charlen.
  t_len = STRLEN( string ).
  s_len = STRLEN( str ).
  t_len =  t_len - s_len .
  s_len = s_len * 2 .
  charlen =  t_len + s_len.
*  WRITE :/,'CHARLEN=' ,charlen, 'STR= ',str.
ENDIF.

 

ENDFUNCTION.


  先解释一下什么是自动按位切割字符串 ,例如: c1(10) type c value '123,,你好'. c2(9) type c .

将 c2 = c1 .此时由于c1中最后一字符是中文占两个字节,那么c2中得到的数据将会是 c2 = '123,,你> ' <-----------出现了乱码

   为了解决这个问题,我写了一个函数如果最后一位是两个字节而被赋值得变量是只剩一个字节空间时,放弃最后一个字符。

例如:

      CALL FUNCTION 'YGET_TEXT_SPLIT'
      EXPORTING
        input  = c1

      IMPORTING
        output = c2.

调用后c2的值为:c2 = '123,,你'  <-----------不会出现了乱码

函数代码如下:

FUNCTION yget_text_split.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(INPUT) TYPE  C
*"     REFERENCE(LENGTH) TYPE  I OPTIONAL
*"  EXPORTING
*"     REFERENCE(OUTPUT) TYPE  C
*"     REFERENCE(RIGHT) TYPE  C
*"----------------------------------------------------------------------
  DATA len TYPE i.
  IF input IS INITIAL.
    RETURN.
  ENDIF.
  IF length IS INITIAL.
    DESCRIBE FIELD output OUTPUT-LENGTH len .
*    len    = STRLEN( output ).
*    CLEAR output.
  ELSE.

    len = length.
  ENDIF.

  CALL FUNCTION 'TEXT_SPLIT'
    EXPORTING
      length = len
      text   = input
    IMPORTING
      line   = output
      rest   = right.


ENDFUNCTION.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值