为什么当字符串中的字符数中相同的字符重复很多次时,我无法得到正确的结果?

0 string abap count conditional-statements

当ABAP中的字符串表达式中相同的字符重复太多次时,我无法得到正确的结果。

当大于 10 时,重复字符给出 * 而不是数字作为结果。

输出 :*WB2W3B4WB

预期输出:12WB2W3B4WB

DATA(input) = 'WWWWWWWWWWWWWWWWBWWBBBWWWWB'.
DATA(count) = 1.
DATA result TYPE string.

DO strlen( input ) - 1 TIMES.

  DATA(lv_single1) = substring( val = input off = sy-index - 1 len = 1 ).
  DATA(lv_single2) = substring( val = input off = sy-index  len = 1 ).

  IF lv_single1 = lv_single2.
    count = count + 1.
  ELSE.
    result = |{ result }{  COND #( WHEN count = 1 THEN '' ELSE count  ) }{ lv_single1 }|.
    count = 1.
  ENDIF.

ENDDO.

result = |{ result }{ COND #( WHEN count = 1 THEN '' ELSE count ) }{ lv_single2 }|.
Run Code Online (Sandbox Code Playgroud)

Ale*_*ell 7

问题在于条件运算符结果的自动类型推断COND

您使用COND #( ... )
#意味着您没有为结果指定具体的非通用数据类型,在这种情况下,必须在第一个操作数之后指定具有静态可识别类型的操作数THEN

THEN使用文字后'',类型会被推断为C(1)。当您随后向此类型分配一个count类型为I(4)且其值需要超过 1 个字符空间的变量时,星号*将被写入为单个字符值。

当源类型为integerb(1 字节)、s(1-2 字节)、i(4 字节)或 int8(8 字节)且目标类型为c类似字符时,转换的确切规则为:
.. .如果目标字段比数字字符串(包括加号/减号)长,在左侧填充空格。如果太短,则对于正值,数字表示将向右移动一位。如果目标字段仍然太短(对于负值),则会在左侧截断并将字符设置 目标字段的第一个位置。*

要解决此问题,请使用任何合适的类型作为 COND 运算符的结果,例如:

  " define some fixed-length character type
  TYPES: tt_char4(4) TYPE c.
  
  ... COND tt_char4( ... ) ...

  " or use string or some type defined in DDIC
  ... COND string( ... ) ...
  ... COND char4( ... ) ...
Run Code Online (Sandbox Code Playgroud)

请注意,使用类似字符的类型可能会引入额外的空格,稍后需要将其删除(类型的结果string包括尾随空格,但固定长度字符类型不包括它们)。您也可以只使用:

   ... COND i( ... ) ...
Run Code Online (Sandbox Code Playgroud)

(即只需将代码替换#i)。

更多信息请访问:COND、条件运算符CONV、实际参数的类型推断