2009-11-22 4 views
59

쉼표를 사용하여 수천을 구분하는 숫자를 나타내는 문자열이 있습니다. 어떻게 파이썬으로 숫자로 변환 할 수 있습니까?쉼표가 천 단위 구분 기호로되어있는 경우 어떻게 파이썬을 사용하여 문자열을 숫자로 변환합니까?

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

ValueError을 생성합니다.

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

+1

어떻게 생각하세요? 이 기능은 이유가 있습니다. –

답변

79
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 
+0

작동하지 않는 로케일이 있습니까? – abyx

+8

+1하지만 로캘 설정을 추가하십시오 (기본 로캘 'C'로하면 여전히 'ValueError'가됩니다!). –

+1

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

30

천 단위 구분 기호로 숫자를 구문 분석하는 데는 여러 가지 방법이 있습니다. 그리고 우분투가 묘사 한 방식이 모든 경우에서 최고라고는 생각하지 않습니다. 그래서 나는 다른 방법들도 열거하고있다. setlocale()에게 전화

  1. 적절한 장소 __main__ 모듈이다. 전역 설정이며 전체 프로그램과 심지어 C 확장에도 영향을줍니다 (LC_NUMERIC 설정은 시스템 수준에서 설정되지 않지만 파이썬에서 에뮬레이트됩니다). caveats in documentation을 읽고이 방법을 사용하기 전에 두 번 생각하십시오. 아마 단일 응용 프로그램에서는 괜찮 겠지만 많은 사람들을 위해 라이브러리에서는 사용하지 마십시오. 일부 시스템에서는 사용할 수 없으므로 특정 charset 인코딩을 사용하여 로케일을 요청하지 않을 수도 있습니다.

  2. 국제화를 위해 제 3 자 라이브러리 중 하나를 사용하십시오. 예를 들어 PyICU을 사용하면 전체 프로세스에 영향을 미치는 사용 가능한 로켈을 사용할 수 있으며 로케일을 사용하지 않고 특정 천 단위 구분 기호로 숫자를 파싱 할 수도 있습니다.

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

  3. 제 3 자 라이브러리를 설치하는 것이 "올바른 방법"이 아닌 경우 사용자 고유의 구문 분석 기능을 작성하십시오. 엄격한 유효성 검사가 필요하지 않은 경우 int(data.replace(',', ''))과 같이 간단 할 수 있습니다.

+0

+1. 이 문제가 생겼을 때 그게 전부 였어. –

+0

오타를 수정하기 위해 편집되었습니다 ('setlocate'는'setlocale'이어야합니다). 또한, +1. –

+0

뻔뻔한 자기 승진, 나는 세 번째 옵션을 사용했습니다. 그러므로 누군가 관심이 있다면 [**이 질문/답변 **] (https://stackoverflow.com/questions/48843193/convert-a-number-using-atof/48845430#48845430) – Jan

3

내가 허용 대답에서 로케일 오류를 얻었으나, 다음과 같은 변화는 핀란드 (윈도우 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 
3

이 작동 :

(A 더러운하지만 빠른 방법)

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

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

이 미국에서 리눅스에 이루어집니다
>>> a = '1,000,000' 
>>> int(a.replace(',' , '')) 
1000000 
>>> float(a.replace(',' , '')) 
1000000.0 
+13

을 참조하십시오. OP 질문을 다시 읽으십시오. 그가 말한 곳에서 특히 : "변환하기 전에 빈 문자열로 쉼표를 대체 할 수 있지만 어떻게 든 잘못 생각합니다. 더 좋은 방법이 있습니까?" – joaquin

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 

. - 설레임

0
#python3 tenzin 
def changenum(data): 
    foo = "" 
    for i in list(data): 
     if i == ",": 
      continue 
     else: 
      foo += i 
    return float(int(foo)) 
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 
관련 문제