ABAPの数値チェック|NUMERIC_CHECKの使い方とCO演算子との違い

ABAPで外部ファイルや連携データを取り込むとき、「入力値が数字だけで構成されているか」を確認したいことがあります。SAP標準の汎用モジュール NUMERIC_CHECK は、入力した文字列の判定結果を HTYPE に返します。半角数字(0~9)だけを許可したいなら、CO 演算子でも簡潔にチェックできます。

NUMERIC_CHECKの基本:HTYPEを確認する

STRING_IN に判定したい値を渡し、戻り値の HTYPE を確認します。HTYPE = 'NUMC' なら数字として判定され、HTYPE = 'CHAR' なら数字以外の文字が含まれる判定です。STRING_OUT も出力パラメータですが、判定だけが目的なら省略できます。

DATA lv_input TYPE string VALUE '12345'.
DATA lv_htype TYPE dd01v-datatype.

IF lv_input IS INITIAL.
  " 空値は別に扱う
ELSE.
  CALL FUNCTION 'NUMERIC_CHECK'
    EXPORTING
      string_in = lv_input
    IMPORTING
      htype     = lv_htype.

  IF lv_htype = 'NUMC'.
    " 数字として判定された場合
  ELSE.
    " 数字以外の文字が含まれる場合
  ENDIF.
ENDIF.

たとえば 12345 は NUMC、12A45 は CHAR と判定されます。戻り値は真偽値ではないため、HTYPE の値を明示して比較してください。実システムでは、対象のSAPリリースでSE37からインターフェースと境界値の挙動を確認すると確実です。

半角数字だけならCO演算子でも判定できる

要件が「空でない文字列が半角の0~9だけでできていること」なら、文字集合を比較する CO(Contains Only)が分かりやすい方法です。

DATA lv_value TYPE string VALUE '00123'.

IF lv_value IS NOT INITIAL
   AND lv_value CO '0123456789'.
  " 半角数字だけで構成される
ELSE.
  " 空値、または半角数字以外を含む
ENDIF.

CN は CO の反対(Contains Not Only)です。ただし、必須入力の判定まで CN だけに任せず、空値は別途確認してください。

入力例空でない文字列に対する CO 判定理由
12345真半角数字だけ
00123真先頭のゼロも数字
12A45偽英字を含む
-123 / 12.3偽符号や小数点を含む

実装時に注意したい3点

  1. 空文字を先に判定する。 string 型の空文字は CO で真になり得ます。必須入力なら IS NOT INITIAL を組み合わせます。
  2. 空白とデータ型を確認する。 c 型の固定長項目では末尾の空白も CO の比較対象です。入力をトリムしてよいかは業務要件で決め、安易に空白を除去しないでください。
  3. 「数字だけ」と「数値として有効」を分ける。 符号、小数点、桁区切り、全角数字を受け付けるかは別の仕様です。金額や数量を扱うなら、形式に加えて型変換・桁数・範囲の検証も必要です。

どちらを使うべきか

半角数字だけを許す入力チェックなら、条件がコードから読み取れる CO 演算子が使いやすいでしょう。既存プログラムで NUMERIC_CHECK を利用している場合は、HTYPE の判定値と空値・空白の扱いを確認してから流用してください。ABAP Cloudなど利用可能なAPIに制限がある環境では、汎用モジュールが使用可能かを開発環境で確認します。

参考・関連記事

関連記事

PAGE TOP