最初の投稿時以降に、もっと簡単な書き方を思い出しましたのでコードと記事を更新しました
Unicode環境における半角・全角混在チェックとなります。
今回、CL_ABAP_LIST_UTILITIESのメソッドと、STRLENを使って
文字列の、「半角のみ」「全角のみ」「半角全角混在」をチェックします。
#####表1:コード内で使用している各文字数・バイト数算出コマンド・メソッドについて
内容 | 説明 |
---|---|
STRLEN | 文字数 |
DYNAMIC_OUTPUT_LENGTH | 入力された文字の総バイト数 |
DEFINED_OUTPUT_LENGTH | 定義長(CHAR30は30) |
MAXIMUM_OUTPUT_LENGTH | 最大バイト長(CHAR30は30*2バイトで60) |
#####表2:判定条件
条件 | 判定 |
---|---|
文字数 = バイト数 | 半角のみ |
文字数 * 2 = バイト数 | 全角のみ |
上記以外 | 半角全角混在 |
今回表2にあるチェックロジックは、CONDを使用して、文字数*2の変数Xを内部で定義して
判定し、そのままCL_DEMO_OUTPUT=>WRITEに書き込むという、ABAPDOCUのような書き方で書きました。
YTEST_SBCDBC_CHECK
REPORT YTEST_SBCDBC_CHECK.
PARAMETERS: P_STR TYPE CHAR30 lower case obligatory.
* 設定値の文字数
DATA(W_STR) = STRLEN( P_STR ). "設定値の文字数
* 設定値のバイト数
DATA(W_DYN) = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( FIELD = P_STR ).
* 設定項目の定義長
*data(W_DEF) = CL_ABAP_LIST_UTILITIES=>DEFINED_OUTPUT_LENGTH( FIELD = P_STR ).
* 設定項目の最大バイト数
*data(W_MAX) = CL_ABAP_LIST_UTILITIES=>MAXIMUM_OUTPUT_LENGTH( FIELD = P_STR ).
CL_DEMO_OUTPUT=>WRITE( |{ P_STR } | ).
CL_DEMO_OUTPUT=>WRITE( | STRLEN { W_STR } | ).
CL_DEMO_OUTPUT=>WRITE( | DYNAMIC { W_DYN } | ).
*CL_DEMO_OUTPUT=>WRITE( | DEFINITION { W_DEF }| ).
*CL_DEMO_OUTPUT=>WRITE( | MAXIMUM { W_MAX }| ).
* 全角半角判定を行い、結果を書き込む
CL_DEMO_OUTPUT=>WRITE(
cond #( LET X = W_STR * 2 in
when w_str = W_DYN then | すべて半角です |
when X = W_DYN then | すべて全角です |
else | 全角と半角が混在しています | ) ).
CL_DEMO_OUTPUT=>DISPLAY( ).
前のコードも一応残しておきます・・・
1文字づつ文字が半角か全角かを確認するやり方
zcheck_1byte2byte
REPORT zcheck_1byte2byte.
parameters: p_str type string.
data(CHAR_NUM) = strlen( p_str ).
DO char_num times.
* 文字を1文字づつ取得
data(moji) =
CL_HRPADJP_CHARACTER_UTILITIES=>GET_NTH_CHAR( IV_STRING = p_STR
iv_pos = sy-index ).
data(moji_after) = moji.
* mojiを1バイト分のみとする→半角文字:同文字、全角文字:null
call method CL_HRPADJP_CHARACTER_UTILITIES=>ADJUST_STR_LEN
exporting IV_TAR_LEN = 1
changing CV_TXT = moji_after.
if moji = moji_after.
* 半角
cl_demo_output=>write( | { moji } { moji_after } 半角 | ).
else. "全角
cl_demo_output=>write( | { moji } { moji_after } 全角 | ).
endif.
enddo.
* result display
cl_demo_output=>display( ).