Print
카테고리: [ Development ]
조회수: 6987

파이썬으로 한글이 포함된 문자열을 print 시 format이 잘 맞지 않는 문제가 발생할 때가 있는데요.

예를 들면 다음과 같죠.

- 코드

print("%-30s   %-30s" % (pairValue, myValue))

- 결과

=================================================================================
1. Korea KRW                     2. 미국 USD
3. 유럽연합 EUR                  4. 일본 JPY (100엔)
5. 중국 CNY                      6. 홍콩 HKD
7. 대만 TWD                      8. 영국 GBP
9. 오만 OMR                      10. 캐나다 CAD
11. 스위스 CHF                   12. 스웨덴 SEK
13. 호주 AUD                     14. 뉴질랜드 NZD
15. 체코 CZK                     16. 칠레 CLP
17. 터키 TRY                     18. 몽골 MNT
19. 이스라엘 ILS                 20. 덴마크 DKK
21. 노르웨이 NOK                 22. 사우디아라비아 SAR
23. 쿠웨이트 KWD                 24. 바레인 BHD
25. 아랍에미리트 AED             26. 요르단 JOD
27. 이집트 EGP                   28. 태국 THB
29. 싱가포르 SGD                 30. 말레이시아 MYR
31. 인도네시아 IDR 100           32. 카타르 QAR
33. 카자흐스탄 KZT               34. 브루나이 BND
35. 인도 INR                     36. 파키스탄 PKR
37. 방글라데시 BDT               38. 필리핀 PHP
39. 멕시코 MXN                   40. 브라질 BRL
41. 베트남 VND 100               42. 남아프리카 공화국 ZAR
43. 러시아 RUB                   44. 헝가리 HUF
=================================================================================

 

해결책은 다음과 같구요.

- 참고 URL :  전각 문자와 반각 문자가 섞였을 때 정렬하기 (http://gnoownow10.cafe24.com/cjk-formatting.html)

- 다음과 같은 함수 사용

import unicodedata
 
def preformat_cjk (string, width, align='<', fill=' '):
    count = (width - sum(1 + (unicodedata.east_asian_width(c) in "WF")
                         for c in string))
    return {
        '>': lambda s: fill * count + s,
        '<': lambda s: s + fill * count,
        '^': lambda s: fill * (count / 2)
                       + s
                       + fill * (count / 2 + count % 2)
}[align](string)

 

위 함수를 적용하여 다시 print 해볼께요.

- 코드

print("%s   %s" % (preformat_cjk(pairValue, 30), preformat_cjk(myValue, 30)))

- 결과

=================================================================================
1. Korea KRW                     2. 미국 USD
3. 유럽연합 EUR                  4. 일본 JPY (100엔)
5. 중국 CNY                      6. 홍콩 HKD
7. 대만 TWD                      8. 영국 GBP
9. 오만 OMR                      10. 캐나다 CAD
11. 스위스 CHF                   12. 스웨덴 SEK
13. 호주 AUD                     14. 뉴질랜드 NZD
15. 체코 CZK                     16. 칠레 CLP
17. 터키 TRY                     18. 몽골 MNT
19. 이스라엘 ILS                 20. 덴마크 DKK
21. 노르웨이 NOK                 22. 사우디아라비아 SAR
23. 쿠웨이트 KWD                 24. 바레인 BHD
25. 아랍에미리트 AED             26. 요르단 JOD
27. 이집트 EGP                   28. 태국 THB
29. 싱가포르 SGD                 30. 말레이시아 MYR
31. 인도네시아 IDR 100           32. 카타르 QAR
33. 카자흐스탄 KZT               34. 브루나이 BND
35. 인도 INR                     36. 파키스탄 PKR
37. 방글라데시 BDT               38. 필리핀 PHP
39. 멕시코 MXN                   40. 브라질 BRL
41. 베트남 VND 100               42. 남아프리카 공화국 ZAR
43. 러시아 RUB                   44. 헝가리 HUF
=================================================================================