5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[ABAP]半角・全角・混在チェックVer1.1(Whether Text is SBC only, DBC only or Mixed)

Last updated at Posted at 2020-01-01

最初の投稿時以降に、もっと簡単な書き方を思い出しましたのでコードと記事を更新しました:smirk:

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( ).

結果サンプルです。
image.png
image.png
image.png

前のコードも一応残しておきます・・・

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( ).
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?