String 循环字符串?

String 循环字符串?,string,abap,String,Abap,如何读取字符串中的每个字符?例如,我想读取字符串“a7m4d0”中的每个字符。之后,我想验证每个字符是一个字符还是一个数字。有任何提示或想法吗?以下是如何访问字符串中的单个字符: 本例将把字符“t”提取到变量“lv_char1”中 在字符串名称后面附加“+4”指定从字符串开始的偏移量(在本例中为4),“(1)”指定要拾取的字符数 有关更多信息,请参阅此处的文档: 如果要依次查看每个字符,可以使用“strlen()”获得字段的长度,并对每个字符进行循环。DATA:smth-TYPE字符串值`qw

如何读取字符串中的每个字符?例如,我想读取字符串“a7m4d0”中的每个字符。之后,我想验证每个字符是一个字符还是一个数字。有任何提示或想法吗?

以下是如何访问字符串中的单个字符:

本例将把字符“t”提取到变量“lv_char1”中

在字符串名称后面附加“+4”指定从字符串开始的偏移量(在本例中为4),“(1)”指定要拾取的字符数

有关更多信息,请参阅此处的文档:

如果要依次查看每个字符,可以使用“strlen()”获得字段的长度,并对每个字符进行循环。

DATA:smth-TYPE字符串值`qwert1yua22sd123bnm,`,
DATA: smth TYPE string VALUE `qwert1yua22sd123bnm,`,
      index TYPE i,
      length TYPE i,
      char  TYPE c,
      num   TYPE i.

length = STRLEN( smth ).

WHILE index < length.
  char = smth+index(1).
  TRY .
      num = char.
      WRITE: / num,'was a number'.
    CATCH cx_sy_conversion_no_number.
      WRITE: / char,'was no number'.
  ENDTRY.
  ADD 1 TO index.
ENDWHILE.
第一类指数, 长度类型i, 字符类型c, num类型i。 长度=标准长度(smth)。 而指数<长度。 char=smth+索引(1)。 尝试 num=char。 写入:/num,“是一个数字”。 捕获cx\u sy\u转换号。 写入:/char,“没有数字”。 结束。 在索引中添加1。 结束时。

您的问题解决了:p有点复杂,在最近的740 ABAP服务器上:

还有一个办法

PERFORM analyze_string USING `qwert1yua22sd123bnm,`.

FORM analyze_string USING VALUE(p_string) TYPE string.

  WHILE p_string IS NOT INITIAL.
    IF p_string(1) CA '0123456798'.
      WRITE: /  p_string(1) , 'was a number'.
    ELSE.
      WRITE: /  p_string(1) , 'was no number'.
    ENDIF.
    p_string = p_string+1.
  ENDWHILE.

ENDFORM.

不需要
数据
语句、字符串函数或显式索引。

我知道这篇文章很旧,但这可能很有用,这就是它的用途:)


你看过文件了吗?如果不是,为什么不呢?如果是,哪一部分给你带来了问题?到目前为止你们试过什么?实际上,因为我刚刚试过这么做,所以“描述”字段对字符串似乎不太管用。我试过不同(更小)尺寸的琴弦,但它的长度似乎总是很奇怪。我发现内置函数“strlen”可以为您提供字符串的精确长度。
descripe
是老式的变体,我更喜欢
strlen()
@vlad ardelen:
descripe字段。。。长度
根本不适用于字符串-它会产生语法错误,至少在较新的版本中是这样。对于C字段,
descripe FIELD
将告诉您字段的长度,而不是内容的长度@vwegert
描述字段。。。字节模式下的长度是我的意思。我不确定我是否完全理解你所说的“C字段”是什么意思。你是说通过内核插件与SAP接口时的某种字段?(因为我不知道这些)@vlad-ardelean C字段,如
datafoo-TYPE C
中的字段。字节模式通常不是您想要的,顺便说一句:-)围绕捕获异常构建代码看起来仍然不正确+1@tomdemuyt我花了一些时间来习惯这种语法,但我现在走的是正确的道路。。。“不幸的是”,大部分SAP新产品/教程现在确实使用了这种语法,因此这是一条可行之路。
DATA: lv_text  TYPE string  VALUE `a7m4d0`.

DO strlen( lv_text ) TIMES.
  DATA(lv_single) = substring( val = lv_text off = sy-index - 1 len = 1 ) && ` is ` &&
                    COND string( WHEN substring( val = lv_text off = sy-index - 1 len = 1 ) CO '0123456789' THEN 'Numeric'
                                 ELSE                                                                             'Character' ).
  WRITE : / lv_single.
ENDDO.
PERFORM analyze_string USING `qwert1yua22sd123bnm,`.

FORM analyze_string USING VALUE(p_string) TYPE string.

  WHILE p_string IS NOT INITIAL.
    IF p_string(1) CA '0123456798'.
      WRITE: /  p_string(1) , 'was a number'.
    ELSE.
      WRITE: /  p_string(1) , 'was no number'.
    ENDIF.
    p_string = p_string+1.
  ENDWHILE.

ENDFORM.
  DATA lv_counter TYPE i.

  DO STRLEN( lv_word ) TIMES.

    IF lv_word+lv_counter(1) CA '0123456789'
      "It's a number 
    ENDIF.

    lv_counter = lv_counter + 1.

  ENDDO.