В RPGLE, как я могу проверить, являются ли последние 3 символа переменной размера 10 числовыми или нет

У меня есть переменная с размером 10. Она хранит значение 10 размера, например «KUNAL12345». Как я могу проверить, являются ли последние 3 символа значения числовыми или нет. В этом случае последние 3 символа - это 345, что является числовым значением.


person Kunal Roy    schedule 03.12.2020    source источник


Ответы (2)


Вы можете использовать % check вот так (я не тестировал )

dcl-c digits '0123456789';
dcl-s value char(10) inz('KUNAL12345');
if %check(%subst(value:8:3):digits) = 0;
  // each of the three last characters is a digit character
endif;

или как говорит @jtaylor

if %checkr(value:digits) < 8;
  // each of the three last characters is a digit character
endif;
person nfgl    schedule 03.12.2020
comment
должно быть %substr(value:8:3) для последних 3 символов - person Charles; 03.12.2020
comment
Вы также можете% checkr () и отказаться от подстроки. - person jtaylor___; 03.12.2020
comment
@ Чарльз, верно! Уже устал 4 часа назад - person nfgl; 03.12.2020
comment
@jtaylor___ тоже верно отредактировал мой ответ, спасибо! - person nfgl; 03.12.2020
comment
Для случая% CHECK вместо жесткого кодирования 8 вы можете использовать% SUBST (VALUE:% LEN (VALUE) -2), чтобы начать с третьего последнего символа и перейти к концу строки (параметр длины не требуется) . Но ... это тоже не идеально, поскольку 2 не очень самодокументируется для третьего последнего символа. - person Barbara Morris; 03.12.2020
comment
% substr должно быть% subst. Я попытался отредактировать его, но это не позволило мне изменить 1 символ. - person Barbara Morris; 03.12.2020
comment
в этом случае синтаксис должен быть: if% checkr (digits: value) ‹8; // каждый из трех последних символов - это цифра endif; нет, если% checkr (значение: цифры) ‹8; // каждый из трех последних символов - это цифра endif; - person Kunal Roy; 04.12.2020

вы можете использовать sql regexp функции. Регулярное выражение, которое соответствует 3 цифрам в конце строки, равно \d\d\d$

вот хорошая запись

d text            s             80a   varying
d match           s             80a   varying
d i5              s              5i 0
d numMatches      s             10i 0
 /free
      text        = 'steve 7335' ;

      exec sql
      set         :numMatches = regexp_count( :text, '\d\d\d$', 1 ) ;
      if          numMatches > 0 ;
      endif ;

      text        = 'steve 733z3' ;
      exec sql
      set         :match :i5 = regexp_substr( :text, '\d\d\d$', 1, 1 ) ;

      if          i5 = -1 ;
      // not a match
      endif ;
person RockBoro    schedule 03.12.2020