int형의 숫자를 str형의 영어로 변환, 반대로도

epiphany·2023년 8월 17일
0

1~99까지 int형의 숫자를 str형의 영어로 변환하는 코드가 필요하여 개발한 내용 기록

1이라고 입력시 one으로 반환하는 코드가 필요하여 검색해보니 대부분 아스키 코드로 변환하는 것만 나와있었다
dict을 모든 값에 사용하는 것은 무식한 방식인 것 같아서 찾아보니 https://wikidocs.net/189137 에서 1~20까지는 모두 dict에 넣고, 그 외에 값은 십단위만 넣어서 한자리 값과 더해서 사용하면 된다는 것을 알게 되었다.
(영단어가 그런 규칙으로 되어있다는 것을 생각하지 못했다..)

코드 작성하면서 사용된 함수

  • input()
  • try, except
  • int()
  • isinstance()
  • items()
  • replace()

Code

english_number = {
    1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 10: 'ten',
    11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty',
    30: 'thirty'}

num = input()

try:
    num = int(num)
except:
    pass

if isinstance(num, int) and num > 0 and num < 100:
    if num < 20:
        print('number is', english_number[num])
    else:
        second = num % 10
        first = num - (second)
        print('number is', english_number[first] + english_number[second])

elif isinstance(num, str):
    result = 0
    for k, v in english_number.items():
        if v in num:
            result += k
            num = num.replace(v, '')
    if num:
        print('invalid number')
    else:
        print('number is', result)

else:
    print('invalid number')

코드는 위와 같이 작성하였다.

Code Description

english_number = {
    1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 
    6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 10: 'ten',
    11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 
    15: 'fifteen', 16: 'sixteen', 17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 
    20: 'twenty', 30: 'thirty'}

english_number라는 dict값을 생성(39까지만 가능한 것으로 구상했기 때문에 40~90은 추가하면 됨)

num = input()

input() 함수는 데이터를 입력받을 수 있도록함
입력받은 값을 num에 저장하도록 함

try:
    num = int(num)
except:
    pass

num에 저장된 값으로 전달되는 값은 숫자더라도 str로 받아지기 때문에 try, except문을 통해 int로 변환할 수 있는 경우는 변환되도록 함

if isinstance(num, int) and num > 0 and num < 100:
    ...
elif isinstance(num, str):
	...
else:
	print('invalid number')

isinstance는 type검사를 해주는 함수로 True/False값을 return해줌
num이 int인 경우는 if문 안으로 들어와서 string으로 변환되도록 작업함
이때 1~99인 경우만 변환이 가능하기 때문에 if문에 조건 추가해주고, 1~99안에 들지 않은 값은 이미 type이 int이기 때문에 elif에도 속하지 않게 되어 else문으로 빠져나가게 됨

int -> str

 if num < 20:
    print('number is', english_number[num])
else:
	...

숫자인 경우는 20이하 초과로 분리해서 if문 작성함
20이하는 생성해둔 dict에서 바로 변환이 가능하기 때문에 변환해서 출력되도록 함

else:
    second = num % 10
    first = num - (second)
    print('number is', english_number[first] + english_number[second])

20초과값은 second변수에 1의 자리 값을 저장하고, frist에서는 입력받은 값에서 1의 자리 값을 빼는 형식으로 진행
25를 입력하는 경우 second에는 5, first는 25-5이므로 20이 저장됨
저장된 값을 english_number라는 dict에서 string으로 변환하여 출력되도록함

str -> int

result = 0
for k, v in english_number.items():
    if v in num:
        result += k
        num = num.replace(v, '')

english_number를 items함수를 사용해서 key, value값을 분리해서 for문 가동
value가 입력받은 값에 존재한다면 key값을 0으로 초기화한 result에 더하도록 함
num의 경우 나중에 validation check를 하기 위해 찾은 값을 빈값으로 치환함

if num:
    print('invalid number')
else:
    print('number is', result)

만약 num이 빈값이 아니라면 invalid number라는 문구를 출력하도록 함
num이 빈값이라면 else문으로 빠지기 때문에 변환된 값으로 더해진 result값을 출력

items() 예시

dict을 k, v로 분리해주며 list와 같이 for문 가동할 수 있음

# items 함수를 사용해서 출력했을때 아래와 같이 출력됨
temp = {1: 'one', 2: 'two'}
for k, v in temp.items():
	print(k, v)

# output
# 1 one
# 2 two

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

많은 것을 배웠습니다, 감사합니다.

답글 달기