상세 컨텐츠

본문 제목

CLASS TEST #5 : Phone Number

카테고리 없음

by Kiroc 2024. 1. 22. 15:34

본문

돌아가기만 하면 되지?! 라는 마음으로 좀 지저분하게 짜 본 코드..

월요병 씨게 와서 앉아 있는게 헬이다

 

이번에 배운 것은 메소드에서 fail 뱉을 때

raise exception type ~~.

구문 사용하는 것!!

 

https://exercism.org/tracks/abap/exercises/phone-number

 

Phone Number in ABAP on Exercism

Can you solve Phone Number in ABAP? Improve your ABAP skills with support from our world-class team of mentors.

exercism.org

 

내가 만든 코드

CLASS zcl_phone_number DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .
  PUBLIC SECTION.
    data : len type i.
    METHODS clean
      IMPORTING
        number       TYPE string
      RETURNING
        VALUE(result) TYPE string
      RAISING
        cx_parameter_invalid.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.


CLASS zcl_phone_number IMPLEMENTATION.
  METHOD clean.
" add your code here
    condense number.
    REPLACE ALL OCCURRENCES OF '-' IN number WITH ''.
    REPLACE ALL OCCURRENCES OF ` ` IN number WITH ''.
    REPLACE ALL OCCURRENCES OF '.' IN number WITH ''.
    REPLACE '(' IN number WITH ''.
    REPLACE ')' IN number WITH ''.
    REPLACE '+1' IN number WITH ''.
    len = strlen( number ).


    if len > 10.
      if number+0(1) = '1'.
        REPLACE FIRST OCCURRENCE OF '1' IN number WITH ''.
      endif.
      len = strlen( number ).
        if len >= 11.
          raise exception type cx_parameter_invalid.
        else.
          if number+0(1) = '1' or number+0(1) = '0'
              or number+3(1) = '1' or number+3(1) = '0'.
            raise exception type cx_parameter_invalid.        
          endif.
        endif.


    elseif len < 10.
        raise exception type cx_parameter_invalid.


    elseif len = 10.
      if number+0(1) = '1' or number+0(1) = '0'
          or number+3(1) = '1' or number+3(1) = '0'.
        raise exception type cx_parameter_invalid.        
      endif.
    endif.


    if len = 10.
        result = number.
    else.
        raise exception type cx_parameter_invalid.      
    endif.


  ENDMETHOD.
ENDCLASS.

 

다른 사람의 좋은 코드

  METHOD clean.
    result = replace( val   = number
                               regex = |[^0-9]| "0-9까지 숫자를 제외한 다른 글자들. ^은 문자열 시작을 의미하는 예약어라고 함
                               with  = ``    "빈칸으로 바꾸자
                               occ   = 0 ). "양수 : 발생 횟수 왼쪽부터 계산 / 음수 : 발생 횟수 오른쪽부터 계산
    IF strlen( result ) = 11 AND result+0(1) = '1'.
      result = result+1.
    ENDIF.


    IF strlen( result ) <> 10.
        RAISE EXCEPTION TYPE cx_parameter_invalid.
    ENDIF.


    IF result+0(1) <= '1' OR result+3(1) <= '1'.
        RAISE EXCEPTION TYPE cx_parameter_invalid.
    ENDIF.


  ENDMETHOD.

 

SAP에서 로컬테스트할때 사용하는 코드
CLASS zcl_phone_number DEFINITION
  "PUBLIC
  FINAL
  CREATE PUBLIC .
  PUBLIC SECTION.
    data len type i.
    METHODS clean
      IMPORTING
        number       TYPE string
      RETURNING
        VALUE(resultTYPE string
      RAISING
        cx_parameter_invalid.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_phone_number IMPLEMENTATION.
  METHOD clean.
    result replaceval   number
                              regex |[^0-9]|
                              with  ``
                              occ   ).
    IF strlenresult 11 AND result+0(1'1'.
      result result+1.
    ENDIF.

    IF strlenresult <> 10.
        RAISE EXCEPTION TYPE cx_parameter_invalid.
    ENDIF.

    IF result+0(1<= '1' OR result+3(1<= '1'.
        RAISE EXCEPTION TYPE cx_parameter_invalid.
    ENDIF.

 

  ENDMETHOD.
ENDCLASS.

DATA go_oref TYPE REF TO zcl_phone_number.
DATA number TYPE string.
DATA result TYPE string.

START-OF-SELECTION.
  CREATE OBJECT go_oref.

    number '+1 (013)-995-0253'. "이부분 바꿔가면서 테스트 해보기
    CALL METHOD go_oref->cleanexporting number number ).