文字の検査

%CHECK(正向きの検査)

[一般形式]

%CHECK (comparator : base {: start})

%CHECK は、ストリング・コンパレーター の中に現れない文字を含む ストリング 基底 の、最初の位置を戻します。基底 のすべての文字が コンパレーター にも現れていれば、関数は 0 を戻します。

検査は開始位置から始められ、コンパレーター・ストリングに含まれていない文字が見付かるまで、右方へと続けられます。 開始位置のデフォルトの値は 1 です。

1 番目のパラメーターのタイプは、文字、図形、UCS-2、固定または可変長でなければなりません。2 番目 のパラメーターは、1 番目のパラメーターと同じタイプである必要があります。 3 番目のパラメーターが指定されている場合、それは、小数点以下の桁数がゼロである非浮動数値でなければなりません。

              
_*..1....+....2....+....3....+....4....+....5....+....6....+....7...+....8.
D*Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D string      S       50a  varying
D                   inz('12, 233 17, 1, 234')
D delimiters    C          ' ,'
D digits      C          '0123456789'
D num       S       50a  varying
D pos       S       10i 0
D len       S       10i 0
D token      S       50a  varying

CL0N01FACTOR1+++++++OPCODE&EXTEXTENDED-FACTOR2+++++++++++++++++++++++++++++
C* // make sure the string ends with a delimiter
C          EVAL   string = string + delimiters

C          DOU string = ''

C* // Find the beginning of the group of digits
C          EVAL   pos = %check (delimiters : string)
C          IF (pos = 0)
C          LEAVE
C          ENDIF

C* // skip past the delimiters
C          EVAL   string = %subst(string : pos)

C* // Find the length of the group of digits
C          EVAL   len = %check (digits : string) - 1

C* // Extract the group of digits
C          EVAL   token = %subst(string : 1 : len)
C          DSPLY ' ' ' ' token;

C* // Skip past the digits
C          IF (len < %len(string));
C          EVAL   string = %subst (string : len + 1);
C          ENDIF

C          ENDDO
              
            

%CHECKR(逆向きの検査)

[一般形式]

%CHECKR (comparator : base {: start})

%CHECKR は、ストリング・コンパレーター の中に現れない文字を含む ストリング 基底 の、末尾の位置を戻します。基底 のすべての文字が コンパレーター にも現れていれば、関数は 0 を戻します。

検査は開始位置から始められ、コンパレーター・ストリングに含まれていない文字が見付かるまで、左方へと続けられます。 開始位置のデフォルトの値は、ストリングの末尾です。

1 番目のパラメーターのタイプは、文字、図形、UCS-2、固定または可変長でなければなりません。2 番目 のパラメーターは、1 番目のパラメーターと同じタイプである必要があります。 3 番目のパラメーターが指定されている場合、それは、小数点以下の桁数がゼロである非浮動数値でなければなりません。

              
_*..1....+....2....+....3....+....4....+....5....+....6....+....7...+....8.
D*Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D string1     s       50a  varying
D                   inz('My *dog* Spot.* @ * @ *')
D string2     s       50a  varying
D                   inz('someone@somewhere.com')
D padChars    C          ' *@'

CL0N01FACTOR1+++++++OPCODE&EXTEXTENDED-FACTOR2+++++++++++++++++++++++++++++
C          EVAL   %LEN(string1) = %checkr(padChars:string1)
C* // %len(string1) is set to 14 (the position of the last character
C* // that is not in "padChars").

C* // string1 = 'My *dog* Spot.'

C          EVAL   %LEN(string2) = %checkr(padChars:string2)
C* // %len(string2) is set to 21 (the position of the last character
C* // that is not in "padChars").

C* // string2 = 'someone@somewhere.com'  (the string is not changed)
              
            

%CHECKと%CHECKRの使用例

%CHECKと%CHECKRを使用して、『'$****12.345*** '』が格納された変数から『12.345』のみを取り出す処理の例文

              
_*..1....+....2....+....3....+....4....+....5....+....6....+....7...+....8.
_*------------------------------------------------------
_* A string contains a numeric value, but it might
_* be surrounded by blanks and asterisks and might be
_* preceded by a currency symbol.
_*------------------------------------------------------
D*Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D string     s       50a  varying inz('$****12.345*** ')

CL0N01FACTOR1+++++++OPCODE&EXTEXTENDED-FACTOR2+++++++++++++++++++++++++++++
C* // Find the position of the first character that is not one of ' $*'
C          EVAL   numStart = %CHECK (' $*' : string)
C* //  = 6

C* // Find the position of the last character that is not one of ' *'
C          EVAL   numEnd = %CHECKR (' *' : string)
C* //  = 11

C* // Extract the numeric string
C          EVAL   string = %SUBST(string : numStart : numEnd - numStart + 1)
C* //  = '12.345'