[python] 천 단위 구분 기호로 쉼표로 숫자를 인쇄하는 방법은 무엇입니까?

수천 구분 기호로 쉼표를 사용 하여 Python 2.6.1 에서 정수를 인쇄하려고합니다 . 예를 들어 숫자를 1234567로 표시하고 싶습니다 1,234,567. 어떻게하면 되나요? Google에서 많은 예제를 보았지만 가장 간단한 실제 방법을 찾고 있습니다.

마침표와 쉼표를 결정하기 위해 로케일마다 다를 필요는 없습니다. 나는 합리적으로 가능한 한 단순한 것을 선호합니다.



답변

알지 못하는 로케일

'{:,}'.format(value)  # For Python ≥2.7
f'{value:,}'  # For Python ≥3.6

로케일 인식

import locale
locale.setlocale(locale.LC_ALL, '')  # Use '' for auto, or force e.g. to 'en_US.UTF-8'

'{:n}'.format(value)  # For Python ≥2.7
f'{value:n}'  # For Python ≥3.6

참고

체재 명세 소형 언어 당 ,

','옵션은 천 단위 구분 기호로 쉼표를 사용하도록 표시합니다. 로케일 인식 구분 기호의 경우 'n'정수 표현 형식을 대신 사용하십시오 .


답변

나는 이것을 작동시켰다.

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format("%d", 1255000, grouping=True)
'1,255,000'

물론, 당신은 필요 하지 않습니다 국제화 지원 명확하고 간결하며 내장 라이브러리를 사용합니다.

추신 “% d”는 일반적인 % 스타일 포맷터입니다. 하나의 포맷터 만 가질 수 있지만 필드 너비 및 정밀도 설정과 관련하여 필요한 모든 것이 될 수 있습니다.

PPS 당신이 일을 할 수 없다면 localeMark의 답변의 수정 된 버전을 제안합니다.

def intWithCommas(x):
    if type(x) not in [type(0), type(0L)]:
        raise TypeError("Parameter must be an integer.")
    if x < 0:
        return '-' + intWithCommas(-x)
    result = ''
    while x >= 1000:
        x, r = divmod(x, 1000)
        result = ",%03d%s" % (r, result)
    return "%d%s" % (x, result)

재귀는 부정적인 경우에 유용하지만 쉼표 당 하나의 재귀는 나에게 약간 과도하게 보입니다.


답변

비효율 성과 가독성을 위해이기는 것은 어렵습니다.

>>> import itertools
>>> s = '-1234567'
>>> ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-')


답변

관련없는 부분을 제거하고 약간 정리 한 후 로케일 그룹화 코드는 다음과 같습니다.

(다음은 정수에만 적용됩니다)

def group(number):
    s = '%d' % number
    groups = []
    while s and s[-1].isdigit():
        groups.append(s[-3:])
        s = s[:-3]
    return s + ','.join(reversed(groups))

>>> group(-23432432434.34)
'-23,432,432,434'

여기에 이미 좋은 답변이 있습니다. 나중에 참조하기 위해 이것을 추가하고 싶습니다. 파이썬 2.7에는 천 단위 구분 기호의 형식 지정자가 있습니다. 파이썬 문서 에 따르면 과 같이 작동합니다

>>> '{:20,.2f}'.format(f)
'18,446,744,073,709,551,616.00'

python3.1에서는 다음과 같은 작업을 수행 할 수 있습니다.

>>> format(1234567, ',d')
'1,234,567'


답변

파이썬 3.6에서 f-strings로 이것을 쉽게 할 수 있다고 언급 한 사람이 아무도 없습니다.

>>> num = 10000000
>>> print(f"{num:,}")
10,000,000

… 콜론 뒤의 부분은 형식 지정자입니다. 쉼표는 원하는 구분 문자이므로f"{num:_}" 쉼표 대신 밑줄을 사용합니다.

이것은 format(num, ",")이전 버전의 python 3 에 사용하는 것과 같습니다 .


답변

다음은 한 줄 정규식 교체입니다.

re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%d" % val)

inegral 출력에만 작동합니다 :

import re
val = 1234567890
re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%d" % val)
# Returns: '1,234,567,890'

val = 1234567890.1234567890
# Returns: '1,234,567,890'

또는 4 자리 미만의 부동 소수점의 경우 형식 지정자를 %.3f다음 으로 변경하십시오 .

re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%.3f" % val)
# Returns: '1,234,567,890.123'

NB : 소수점 이하 자릿수를 그룹화하려고 시도하기 때문에 소수점 이하 세 자리 이상에서는 올바르게 작동하지 않습니다.

re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%.5f" % val)
# Returns: '1,234,567,890.12,346'

작동 원리

그것을 분해하자 :

re.sub(pattern, repl, string)

pattern = \
    "(\d)           # Find one digit...
     (?=            # that is followed by...
         (\d{3})+   # one or more groups of three digits...
         (?!\d)     # which are not followed by any more digits.
     )",

repl = \
    r"\1,",         # Replace that one digit by itself, followed by a comma,
                    # and continue looking for more matches later in the string.
                    # (re.sub() replaces all matches it finds in the input)

string = \
    "%d" % val      # Format the string as a decimal to begin with


답변

이것이 내가 수레를 위해하는 일입니다. 솔직히 말해서 어떤 버전이 작동하는지 잘 모르겠습니다 .2.7을 사용하고 있습니다.

my_number = 4385893.382939491

my_string = '{:0,.2f}'.format(my_number)

반환 : 4,385,893.38

업데이트 : 최근 에이 형식에 문제가 있었지만 (정확한 이유를 알려줄 수는 없지만) 다음을 삭제하여 해결할 수있었습니다 0.

my_string = '{:,.2f}'.format(my_number)