천 단위 구분 기호로 쉼표가있는 경우 문자열을 숫자로 변환하는 방법은 무엇입니까?


85

수천을 구분하기 위해 쉼표를 사용하는 숫자를 나타내는 문자열이 있습니다. 이것을 파이썬에서 어떻게 숫자로 변환 할 수 있습니까?

>>> int("1,000,000")

생성합니다 ValueError.

변환을 시도하기 전에 쉼표를 빈 문자열로 바꿀 수 있지만 어떻게 든 잘못 느껴집니다. 더 좋은 방법이 있습니까?

답변:


103
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) 
locale.atoi('1,000,000')
# 1000000
locale.atof('1,000,000.53')
# 1000000.53

9
+1,하지만 로케일 설정을 추가하십시오 (이 기본 로케일 'C'은 여전히 ValueError!를 제공합니다 ).
Alex Martelli

1
나는 전문가가 다음과 같은 의미라고 생각합니다 : locale.setlocale (locale.LC_ALL, 'en_US.UTF-8')
mbarkhau

의견 주셔서 감사합니다. 특정 로케일을 추가했습니다.
unutbu

아주 좋아. 이렇게하면 쉼표와 점이 전환되는 유럽 숫자를 처리 할 수 ​​있습니다. 감사.
dsimard

5
로케일 오류가 발생합니다.Traceback (most recent call last): File "F:\test\locale_num.py", line 2, in <module> locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) File "F:\Python27\lib\locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
Tony Veijalainen 2010 년

40

천 단위 구분 기호로 숫자를 구문 분석하는 방법에는 여러 가지가 있습니다. 그리고 @unutbu가 설명하는 방식이 모든 경우에 최고라고 생각합니다. 그래서 다른 방법도 나열합니다.

  1. 호출 할 적절한 장소 setlocale()__main__모듈에 있습니다. 전역 설정이며 전체 프로그램과 C 확장에도 영향을줍니다 (LC_NUMERIC 설정은 시스템 수준에서 설정되지 않고 Python에 의해 에뮬레이션 됨). 읽기 설명서에주의 사항을 이 길을 가기 전에 두 번 생각합니다. 단일 응용 프로그램에서는 괜찮지 만 광범위한 청중을 위해 라이브러리에서 사용하지 마십시오. 일부 시스템에서는 사용할 수 없을 수 있으므로 특정 문자 집합 인코딩을 사용하여 로케일을 요청하지 않는 것이 좋습니다.

  2. 국제화를 위해 타사 라이브러리 중 하나를 사용합니다. 예를 들어 PyICU 는 전체 프로세스에 영향을주지 않고 사용 가능한 모든 로케일을 사용할 수 있습니다 (그리고 로케일을 사용하지 않고 특정 천 단위 구분 기호로 숫자를 구문 분석 할 수도 있습니다).

    NumberFormat.createInstance (Locale ( 'en_US')). parse ( "1,000,000"). getLong ()

  3. "올바른 방법"을 수행하기 위해 타사 라이브러리를 설치해야 할 사항이없는 경우 고유 한 구문 분석 기능을 작성하십시오. int(data.replace(',', ''))엄격한 유효성 검사가 필요하지 않을 때 처럼 간단 할 수 있습니다 .


1
간단한 방법을 추천하는 +1. 그게 내가이 같은 문제를 겪었을 때 필요한 전부입니다.
Michael Kristofik 2011

오타를 수정하기 위해 수정되었습니다 ( setlocate이어야 함 setlocale). 또한 +1.
Mark Dickinson

뻔뻔한 자기 홍보, 세 번째 옵션을 사용했습니다. 누군가 관심 이 있다면이 질문 / 답변을
Jan

14

쉼표를 빈 문자열로 바꾸고 결과 문자열을 int또는 로 바꿉니다 float.

>>> a = '1,000,000'
>>> int(a.replace(',' , ''))
1000000
>>> float(a.replace(',' , ''))
1000000.0

21
OP 질문을 다시 읽으십시오. 특히 그는 "변환을 시도하기 전에 쉼표를 빈 문자열로 바꿀 수 있지만 어떻게 든 잘못된 느낌입니다. 더 좋은 방법이 있습니까?"
joaquin 2014 년

1
나는 OP (strs를 int로 변환)와 거의 동일한 요구 사항을 가지고 있기 때문에이 대답이 유용하다는 것을 알았지 만 허용 된 대답보다 더 간단한 방법을 갖게되어 기쁩니다.
Cai

4

이것은 작동합니다 :

(더럽지 만 빠른 방법)

>>> a='-1,234,567,89.0123'
>>> "".join(a.split(","))
'-123456789.0123'

3

수락 된 답변에서 로케일 오류가 발생했지만 핀란드 (Windows XP)에서 다음 변경 사항이 작동합니다.

import locale
locale.setlocale( locale.LC_ALL, 'english_USA' )
print locale.atoi('1,000,000')
# 1000000
print locale.atof('1,000,000.53')
# 1000000.53

1

나는 이것을 시도했다. 그것은 질문을 넘어선 다 : 당신은 입력을 받는다. 먼저 문자열로 변환됩니다 (예를 들어 Beautiful soup의 목록 인 경우). 그런 다음 int로, 다음으로 부동합니다.

그것은 얻을 수있는 한 멀리갑니다. 최악의 경우 변환되지 않은 모든 것을 문자열로 반환합니다.

def to_normal(soupCell):
''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets.
US thousands separators are taken into account.
needs import locale'''

locale.setlocale( locale.LC_ALL, 'english_USA' ) 

output = unicode(soupCell.findAll(text=True)[0].string)
try: 
    return locale.atoi(output)
except ValueError: 
    try: return locale.atof(output)
    except ValueError:
        return output

0
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "")
'en_US.UTF-8'
>>> print locale.atoi('1,000,000')
1000000
>>> print locale.atof('1,000,000.53')
1000000.53

이것은 미국의 Linux에서 수행됩니다.


-1
#python3 tenzin
def changenum(data):
    foo = ""
    for i in list(data):
        if i == ",":
            continue
        else:
            foo += i
    return  float(int(foo))

2
그 코드에 대한 설명이 있습니까? 수프 한 그릇은 보통 수프 스푼과 함께 제공됩니다
cs95
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.