수천 구분 기호로 쉼표를 사용 하여 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 당신이 일을 할 수 없다면 locale
Mark의 답변의 수정 된 버전을 제안합니다.
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)