문서를 작성할 때 금액을 한글로 작성하는 경우가 있습니다.
12,000원은 금일만이천원
120,000원은 금일십이만원
이런 식으로 숫자로 된 금액을 한글로 된 금액으로 바꾸어 주는 코드입니다.
전체 코드
import re
def extracting_number(num_str):
if '.' in num_str:
return "금액에는 소수점을 입력할 수 없습니다."
is_negative = num_str.startswith('-')
num_str = re.sub(r"[^\d]", "", num_str)
if not num_str:
return "유효한 숫자를 입력하세요."
num = int(num_str)
if num >= 10**16:
return "해당 금액은 처리할 수 없는 금액입니다."
result = number_to_korean(num)
if is_negative:
result = "마이너스 " + result
return result
def number_to_korean(num):
if num == 0:
return "영"
units = ["", "만", "억", "조"]
numbers = ["", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"]
num_str = str(num)
num_str = num_str.zfill((len(num_str) + 3) // 4 * 4)
result = []
for i in range(0, len(num_str), 4):
part = num_str[i:i+4]
part_result = []
for j, digit in enumerate(part):
if digit != "0":
part_result.append(numbers[int(digit)] + ["천", "백", "십", ""][j])
if part_result:
result.append("".join(part_result) + units[(len(num_str) - i) // 4 - 1])
return "금" + "".join(result) + "원"
user_input = input("숫자를 입력하세요: ")
result = extracting_number(user_input)
print(result)
코드 설명
먼저 사용자로부터 금액을 입력받습니다.
input 함수를 통해 입력받았으므로 텍스트로 인식이 됩니다.
user_input = input("숫자를 입력하세요: ")
입력받은 값을 인자로 하여
함수를 호출합니다.
result = extracting_number(user_input)
그리고 extracting_number 함수는 다음과 같은 일을 처리합니다.
첫째. 금액은 소수점 이하가 있으면 안 되므로 소수점이 있는지 확인합니다.
둘째. 입력된 금액이 음수인지 확인합니다.
셋째. 입력한 내용에서 숫자만 추출합니다.
넷째. 추출된 숫자는 아직 텍스트로 인식되므로, int 형으로 바꾸어 줍니다.
다섯째. 경 이상의 숫자라면 처리하지 않습니다.
여섯째. number_to_korea 함수를 호출하고, 결과를 받아 최종 결과를 출력합니다.
def extracting_number(num_str):
if '.' in num_str:
return "금액에는 소수점을 입력할 수 없습니다."
is_negative = num_str.startswith('-')
num_str = re.sub(r"[^\d]", "", num_str)
if not num_str:
return "유효한 숫자를 입력하세요."
num = int(num_str)
if num >= 10**16:
return "해당 금액은 처리할 수 없는 금액입니다."
result = number_to_korean(num)
if is_negative:
result = "마이너스 " + result
return result
number_to_korea() 함수는
extracting_number() 함수가 전달한 숫자를 한글 금액으로 바꾸어 주는 역할을 합니다.
한글로 금액을 표시한 것을 잠시 살펴보겠습니다.
일천이백이십이
일천이백이십이만일천이백이십이
일천이백이십이억일천이백이십이만일천이백이십이
일천이백이십이조일천이백이십이억일천이백이십이만일천이백이십이
만, 억, 조 단위를 기준으로 보면 양쪽의 구조가 동일합니다.
이제 함수를 살펴보겠습니다.
0이 전달되었으면, 단순히 "영"으로 처리합니다.
if num == 0:
return "영"
아래 코드는 사용할 단위를 나열한 것입니다.
그리고 숫자를 텍스트로 바꾸어 줍니다.
결과를 저장할 빈 리스트(result)도 하나 만들어 줍니다.
units = ["", "만", "억", "조"]
numbers = ["", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"]
num_str = str(num)
result = []
아래 코드는 자릿수를 4의 배수로 맞추기 위한 코드입니다.
num_str = num_str.zfill((len(num_str) + 3) // 4 * 4)
zfill() 함수는 파이썬에서 문자열의 앞부분을
0으로 채워 일정한 길이를 가지도록 하는 함수입니다.
숫자 형태의 문자열을 다룰 때 특히 유용하며,
주로 자리 수를 맞출 때 사용됩니다.
예를 들어 42를 입력받아 str 변수에 입력하고
str.zfill(4)를 하면 출력은 0042가 됩니다.
그 뒤 코드는 예시로 설명하겠습니다.
만약 입력값이 123456789 라면
아래 코드를 통해 000123456789로 변환이 됩니다.
num_str = num_str.zfill((len(num_str) + 3) // 4 * 4)
그다음 아래의 for 문을 통해 4자리씩 쪼개지게 됩니다.
즉, [ 0001 / 2345 / 6789 ]로 분리됩니다.
결과를 담을 빈 리스트도 하나 만들어 줍니다.
for i in range(0, len(num_str), 4):
part = num_str[i:i+4]
part_result = []
그다음 4자리씩 분리된 것을 처리합니다.
먼저 0001을 처리하는데
enumerate 함수를 통해
인덱스와 값으로 나누어집니다.
인덱스(j) | 값(digit) |
0 | 0 |
1 | 0 |
2 | 0 |
3 | 1 |
for j, digit in enumerate(part):
if digit != "0":
part_result.append(numbers[int(digit)] + ["천", "백", "십", ""][j])
digit이 0이면 처리하지 않으므로 앞에 0 세 개는 처리되지 않습니다.
4번째 값인 1이 들어오면 j = 3 / digit = 1이 됩니다.
그다음 part_result.append()를 통해 part_result에 값을 추가합니다.
numbers는 위에서 아래와 같이 정의했습니다.
그렇기 때문에 numbers[int(digit)]은 numbers[1]이 되므로 "일"이 됩니다.
numbers = ["", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"]
그다음 j 값은 3이므로 ""이 전달됩니다.
여기까지 part_result에 입력된 값은 "일"입니다.
그 다음 result에 값을 추가합니다.
추가되는 값은 다음과 같습니다.
if part_result:
result.append("".join(part_result) + units[(len(num_str) - i) // 4 - 1])
part_result에 units[(len(num_str) - i) // 4 - 1])에 해당하는 값을 붙여줍니다.
units는 아래와 같이 정의되어 있습니다.
units = ["", "만", "억", "조"]
즉, number_str 은 12이고 i = 0이므로
12-0//4-1 = 2가 됩니다.
units[2]는 "억"이므로
result에 "일억"이 우선 추가됩니다.
그다음 2345가 처리됩니다.
enumerate() 함수에 의해 아래와 같이 우선 처리됩니다.
인덱스(j) | 값(digit) |
0 | 2 |
1 | 3 |
2 | 4 |
3 | 5 |
아래 코드를 통해
[ 이천삼백사십오 ]가 됩니다.
part_result.append(numbers[int(digit)] + ["천", "백", "십", ""][j])
아래 코드를 통해
part_result 리스트에 앞서 넣었던 [ 일억 ]과 합쳐져 [ 일억이천삼백사십오 ]가 되고
units의 리스트에서 [ 만 ]을 가지고 와 [ 일억이천삼백사십오만 ]이 됩니다.
result.append("".join(part_result) + units[(len(num_str) - i) // 4 - 1])
마지막 6789도 동일한 과정에 의해 처리되고
최종 처리된 값은 앞에 [ 금 ] 뒤에 [ 원 ]을 붙여
[ 금일억이천삼백사십오만육천칠백팔십구원 ]이 됩니다.
여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.
'파이썬(Python)' 카테고리의 다른 글
[ 파이썬 한글 자동화 ] 지정한 범위의 텍스트 출력하기, 선택 범위 텍스트 출력 (1) | 2024.10.14 |
---|---|
[ 파이썬 한글 자동화 ] 숫자를 금액으로 바꾸기 : 금100,000원으로 바꾸기 (0) | 2024.10.14 |
[ 파이썬 한글 자동화 ] 한글 문서의 위치 : GetPos(), SetPos() (0) | 2024.10.11 |
[ 파이썬 한글 자동화 ] 한글 문서(Hwp) 안의 표 개수 확인하기 (0) | 2024.10.11 |
[ 파이썬 한글 자동화 ] 실행 중인 한글(Hwp, Hwpx) 프로그램 조작하기 (2) | 2024.10.10 |