[ABAP]반각·전각·혼재 체크 Ver1.1(Whether Text is SBC only, DBC only or Mixed)

8312 단어 abapSAP
처음 게시 할 때부터 더 간단한 쓰기를 기억했으므로 코드와 기사를 업데이트했습니다

유니코드 환경에서의 반각·전각 혼합 체크가 됩니다.
이번에는 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 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( ).

결과 샘플입니다.




이전 코드도 일단 남겨 둡니다 ...
한 문자씩 문자가 반각인지 전각인지 확인하는 방법

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

좋은 웹페이지 즐겨찾기