Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 378 – 천 단위 구분 기호 형식 지정자

Author:
Raymond Hettinger <python at rcn.com>
Status:
Final
Type:
Standards Track
Created:
12-Mar-2009
Python-Version:
2.7, 3.1
Post-History:
12-Mar-2009

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

동기

천 단위 구분 기호를 사용해 숫자를 형식화하는 간단하고 로케일을 인식하지 않는 방법을 제공합니다.

천 단위 구분 기호를 추가하는 것은 프로그램 출력을 사람이 이해하기 쉽게 만드는 가장 간단한 방법 중 하나이며, 전문적인 외관과 가독성을 향상합니다.

금융 분야에서는 천 단위 구분 기호가 포함된 출력이 표준입니다. 금융 사용자와 비전문 프로그래머는 로케일 방식이 불편하고 난해하며 직관적이지 않다고 생각합니다.

로케일 모듈에는 두 가지 다른 문제도 있습니다. 첫째, 이는 전역 설정이므로 여러 로케일에서 요청을 처리해야 하는 멀티스레드 애플리케이션에는 적합하지 않습니다. 둘째, 관련 로케일의 이름(예: “de_DE”)은 플랫폼마다 다를 수 있으며 아예 정의되어 있지 않을 수도 있습니다. 로케일 모듈의 문서에서는 이러한 문제와 many other challenges을 자세히 설명합니다.

로케일 모듈을 대체하거나, 국제화 작업을 수행하거나, 가능한 모든 관례를 수용하는 것이 목표는 아닙니다. 이러한 작업에는 Babel 같은 견고한 도구가 더 적합합니다. 대신 많은 사용자가 흔히 수행하는 일상적인 작업을 더 쉽게 만드는 것이 목표입니다.

주요 제안(Alyssa Coghlan 작성, 원래 제안 I로 불림)

format() 지정자 미니 언어에 쉼표가 추가됩니다.:

[[fill]align][sign][#][0][width][,][.precision][type]

‘,’ 옵션은 출력에 쉼표를 천 단위 구분 기호로 포함해야 함을 나타냅니다. 소수점으로 마침표를 사용하지 않는 로케일과 마찬가지로, 자릿수 구분에 다른 관례를 사용하는 로케일에서는 적절한 형식화를 위해 로케일 모듈을 사용해야 합니다.

이 제안은 부동 소수점 수, 정수 및 십진수와 잘 작동합니다. 또한 다른 구분 기호로 쉽게 대체할 수 있습니다. 예를 들어 다음과 같습니다.:

format(n, "6,d").replace(",", "_")

이 기법은 완전히 일반적이지만 쉼표와 마침표를 서로 바꿔야 하는 한 가지 경우에는 불편합니다.:

format(n, "6,f").replace(",", "X").replace(".", ",").replace("X", ".")

width 인자는 쉼표와 소수점을 포함한 전체 길이를 의미합니다.:

format(1234, "08,d")     -->    '0001,234'
format(1234.5, "08,.1f") -->    '01,234.5'

‘,’ 옵션은 위에 표시된 대로 ‘d’, ‘e’, ‘f’, ‘g’, ‘E’, ‘G’, ‘%’, ‘F’ 및 ‘’ 형식에 대해 정의됩니다. 향후 확장을 허용하기 위해 그 밖의 형식, 즉 이진수, 8진수, 16진수, 문자 등에는 정의되지 않습니다.

이 제안은 대안 제안보다 단순하다는 장점이 있지만 훨씬 덜 유연하며 처음부터 바로 충족하는 사용자의 요구도 더 적습니다. 대체 구분 기호를 지정하기 위한 다른 해결책이 등장할 것으로 예상됩니다.

현재 미니 언어 버전

다른 언어의 방식에 관한 연구

웹을 살펴보면 천 단위 구분 기호는 대개 COMMA, DOT, SPACE, APOSTROPHE 또는 UNDERSCORE 중 하나입니다.

C-Sharp는 두 방식(픽처 포맷팅과 타입 지정자)을 모두 제공합니다. 타입 지정자 방식은 로캘을 인식합니다. 픽처 포맷팅은 천 단위 구분자로 콤마만 제공합니다.:

String.Format("{0:n}", 12400)     ==>    "12,400"
String.Format("{0:0,0}", 12400)   ==>    "12,400"

Common Lisp은 천 단위 구분자로 콤마를 출력하기 위해 ~D 십진 타입 지정자 앞에 콜론을 사용합니다. ~D의 일반 형식은 ~mincol,padchar,commachar,commaintervalD입니다. padchar의 기본값은 SPACE입니다. commachar의 기본값은 COMMA입니다. commainterval의 기본값은 3입니다.

(format nil "~:D" 229345007)   =>   "229,345,007"
  • ADA language는 수치 리터럴에 언더스코어를 허용합니다.

Visual Basic과 그 계열(예: MS Excel)은 완전히 다른 방식을 사용하며 다음과 같은 매우 유연한 사용자 지정 포맷 지정자를 갖고 있습니다.:

"_($* #,##0_)".

COBOL은 다음과 같은 픽처 절을 사용합니다.:

PICTURE $***,**9.99CR

Java는 픽처 패턴(양수용 하나와 선택적인 음수용 하나)을 사용하는 Decimal.Format Class를 제공하는데, 예를 들면 "#,##0.00;(#,##0.00)"와 같습니다. 이는 백 단위와 만 단위를 포함한 임의의 그룹화와 불균등한 그룹화를 허용합니다. 특수 패턴 문자는 로캘에 종속되지 않습니다(소수점 구분자로 DOT를, 그룹 구분자로 COMMA를 사용). 사용자는 포맷터의 DecimalFormatSymbols 객체를 사용해 대체 기호 집합을 제공할 수 있습니다.

대안 제안(Eric Smith가 제시했으며, 원래는 Proposal II라고 불림)

천 단위 구분 기호와 소수점 구분 기호 모두 사용자가 지정할 수 있게 하되, 로캘을 인식하지는 않도록 합니다. 단순함을 위해, 선택지를 COMMA, DOT, SPACE, APOSTROPHE, UNDERSCORE로 제한합니다. SPACE는 U+0020 또는 U+00A0 중 하나가 될 수 있습니다.

구분 기호 뒤에 정밀도가 오면 그것은 소수점 구분 기호이며, 그 앞에 오는 선택적 구분 기호는 천 단위 구분 기호입니다. 정밀도가 없을 때, 단독으로 쓰인 지정자는 천 단위 구분 기호를 의미합니다:

[[fill]align][sign][#][0][width][tsep][dsep precision][type]

예제:

format(1234, "8.1f")     -->    '  1234.0'
format(1234, "8,1f")     -->    '  1234,0'
format(1234, "8.,1f")    -->    ' 1.234,0'
format(1234, "8 ,f")     -->    ' 1 234,0'
format(1234, "8d")       -->    '    1234'
format(1234, "8,d")      -->    '   1,234'
format(1234, "8_d")      -->    '   1_234'

이 제안은 대부분의 요구를 충족하지만, 그 대가로 파싱하는 데 약간 더 많은 노력이 필요합니다. 가능한 모든 관례를 다루지는 않지만, 적어도 옵션 중 하나(공백 또는 밑줄)는 다양한 배경을 가진 사람들이 읽고 이해하고 유용하게 쓸 수 있어야 합니다.

예제에서 보듯이, width 인자는 천 단위 구분 기호와 소수점 구분 기호를 포함한 전체 길이를 의미합니다.

locale 모듈에 대해서는 변경이 제안되지 않습니다.

천 단위 구분 기호는 ‘d’, ‘e’, ‘f’, ‘g’, ‘%’, ‘E’, ‘G’, ‘F’ 타입에 대해 위에서 보인 바와 같이 정의됩니다. 향후 확장을 허용하기 위해, 그 외의 타입(이진수, 8진수, 16진수, 문자 등)에 대해서는 정의되지 않습니다.

이 대안 제안의 단점은 단일 구분 기호가 천 단위 구분 기호인지 소수점 구분 기호인지 머릿속으로 파싱하기 어렵다는 것입니다. 소수점 구분 기호를 정밀도 지정자와 연결하는 것은 어쩌면 너무 난해할 수 있습니다.

해설

  • 일부 논평자는 형식 문자열이라는 아이디어 자체를 좋아하지 않으며, 읽기 어렵다고 여깁니다. 제안된 대안으로는 COBOL 스타일의 PICTURE 접근 방식이나 가능한 모든 조합에 대해 키워드 인자를 두는 편의 함수가 있습니다.
  • 일부 뉴스그룹 응답자는 국제화되지 않은 스크립트가 설 자리는 없으며, 특정 선택을 하드와이어링하는 간단한 방법을 제공하는 것은 퇴보라고 생각합니다(이는 로케일에 민감한 접근 방식을 사용할 유인을 줄입니다).
  • 또 다른 견해로는, 개별 형식 문자열에 특정 관례를 내장하면 나중에 그 관례를 바꾸기 어려워진다는 것이 있습니다. 실행 가능한 대안은 제시되지 않았지만, 전반적인 아이디어는 관례를 한 번 설정하면 어디에나 적용되도록 하자는 것입니다(다른 이들은 로케일이 이미 그런 방법을 제공한다고 언급했습니다).
  • 부동소수점 수의 소수부 자릿수를 그룹화하는 선례가 일부 있지만, 이 PEP는 그 영역까지는 다루지 않습니다. 소수점 왼쪽의 자릿수만 그룹화됩니다. 이는 향후 확장을 배제하지 않습니다. 다만 형식화 언어에 대한 하나의 일반적으로 유용한 확장에 초점을 맞출 뿐입니다.
  • James Knight는 인도/파키스탄 숫자 체계가 백 단위로 그룹화한다고 지적했습니다. Ben Finney는 중국어가 만 단위로 그룹화한다고 언급했습니다. Eric Smith는 이러한 방식이 이미 locale 모듈의 “n” 지정자로 처리되고 있다고 지적했습니다(다만 정수에 한해서입니다). 이 PEP는 그런 모든 가능성을 지원하려 하지 않습니다. 이 PEP는 많은(전부는 아니지만) 맥락에서 가독성을 빠르게 개선할 방법을 제공하는, 비교적 흔한 단일 그룹화 관례에 초점을 맞춥니다.