문자열 포맷팅이 왜 필요할까?

 

예를 들어 게임을 시작했다. 주인공의 이름을

 

'김왕자' 라고 지었다.

 

그러면 게임에서 텍스트를 출력한다.

 

김왕자 님 안녕하세요?

또 다른 플레이어가 로그인 해서 '왕초김' 이라고 이름을 지었다.

 

왕초김 님 안녕하세요?

 

약간 앵무세긴 하지만 이게 컴퓨터가 하는일이다.

 

우리는 공통된 부분과 변하는 부분을 잡아낼 수 있다. 바로

 

'이름' + 님 안녕하세요?

 

라는 텍스트 출력 방식이다.

 

텍스트 문자열을 다룰 때 특정 부분을 원하는 값으로 바꿀 때 서식 지시자(%가 들어가는것)나 포맷을 사용한다. 포맷은 물론 파이썬에서 제정된 방식이다.

 

a = 'Mr KIM'
b = 'King of KIM'

print('Hello %s!'%a)
print('Hello %s!'%b)

------------------------

Hello Mr KIM!
Hello King of KIM!

Process finished with exit code 0

코드를 보면 %s 부분과 a,b 변수가 연결되어 있음을 알 수 있다. 이것이 format specifier이다. %s는 입력변수 a에게 string 타입의 변환을 지시히는 것이다. 신박하다!

사실 C언어부터 있었던 형식임 ㄷㄷㄷ

 

숫자

 

숫자는 어떻게 표시할까? 정수는 %d , 실수(부동형)는 %f 이다.

 



natural_number1 = 25
float_real1 = 10.5

print("number: %d" %natural_number1)
print("number: %f" %natural_number1)

print("number: %d" %float_real1)
print("number: %f" %float_real1)

print("number: %.3f" % 2.5678)
print("number: %d" % 300.0)
======================================================

D:\pytutorial\Scripts\python.exe D:/pytutorial/test.py
number: 25
number: 25.000000
number: 10
number: 10.500000
number: 2.568
number: 300

Process finished with exit code 0

%d는 decimal 10진 정수이다. %f는 float 부동소수점 실수이다.

 

두개를 다 실행시켜 보니 차이점을 알겠다. 정수는 어차피 소수점이 필요없다. 전부 0이니까. 실수는 f 지시자가 없으면 소수점 아래가 버려진다. 리터럴 상수도 표현가능하다. %.3f 서식은 소수점 3자리까지 반올림한다.

 

문자열 숫자열 정렬하기

의외로 많이 사용한다. 정렬하면 데이터가 더 잘 보인다. 20은 총 길이를 설정하고 -는 왼쪽 정렬 + 는 오른쪽 정렬이다

a = "My Python"
b = "is perfect!"

print('%-20s'%a)
print('%20s'%b)

문자열 정렬

 

숫자열도 정렬한다. -는 왼쪽 +는 오른쪽임을 감안하여 상황에 맞게 텍스트를 조작한다.

c = 100
d = 15000

print('%5d'%(c))
print('%5d'%(d))

 

 

*문자열안에 여러개 서식 지정자 넣기

 

import time

a = time.strftime(time.ctime())
b = 5000

print ("%s %d"%(a,b))

----------------------------------------------------------

D:\pytutorial\Scripts\python.exe D:/pytutorial/test.py
Thu Aug 20 18:38:57 2020 5000

Process finished with exit code 0

 

* format 메소드

이전의 서식 지정자가 좀 올드한 느낌이었다면 format 메소드는 파이썬 다운 느낌이 든다. 더 쎄끈하고 간단하다.

 

인덱스는 인자의 순서와 매치된다. 인덱스가 있으므로 여러번 값을 반복해도 된다. 

str1 = 'Python is'
str2 = 'really nice'
str3 = 'super cool'

print("{0} {2} {1}".format(str1,str2, str3))

str1 = 'Python is'
str2 = 'really nice'
str3 = 'super cool'

print("{start} {middle} {end}".format(start=str1,end = str2, middle=str3))

인덱스 대신 이름을 지정할 수가 있다.

str1 = 'Python is'
str2 = 'really nice'
str3 = 'super cool'

print(f"{str1} {str3} {str2}")

아예 변수 명칭을 사용해도 된다.

문자열 정렬하기

포맷팅으로 문자를 정렬한다.

str1 = 'Python'
str2 = 'really'
str3 = 'cool'

print('{0:>10}'.format(str1))
print('{0:<10}'.format(str2))
print('{0:>10}'.format(str3))

 

*정수형 정렬 하기

print('{0:05d}'.format(1))
print('{0:05d}'.format(12))
print('{0:05d}'.format(123))
print('{0:05d}'.format(1234))
print('{0:05d}'.format(12345))

*실수형 정렬하기

print('{0:012.5f}'.format(1.1))
print('{0:012.5f}'.format(12.12))
print('{0:012.5f}'.format(123.123))
print('{0:012.5f}'.format(1234.1234))
print('{0:012.5f}'.format(12345.12345))

*실수형 정렬하기 (왼쪽에 몰기)

print('{0:0<12.5f}'.format(1.1))
print('{0:0<12.5f}'.format(12.12))
print('{0:0<12.5f}'.format(123.123))
print('{0:0<12.5f}'.format(1234.1234))
print('{0:0<12.5f}'.format(12345.12345))

 

문자열의 형식이 다양하다 보니 조작법도 다양할 수 밖에 없다. 이 조작법은 전부 외울 필요는 없다. 시간이 지나면서 익숙해진 것은 자동으로 외워진다.

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band