파이썬에서 점과 쉼표가있는 문자열을 부동 소수점으로 어떻게 변환 할 수 있습니까?


94

파이썬 123,456.908에서 부동 처럼 문자열을 어떻게 변환 할 수 123456.908있습니까?


11
이를 수행하는 적절한 방법은 locale모듈 을 사용하는 것입니다. 다른 모든 것은 미래에 문제를 일으킬 수있는 매우 불쾌한 해킹 일뿐입니다.
Nick Bastin 2011

답변:


134

다음 ,replace()같이 제거하십시오 .

float("123,456.908".replace(',',''))

15
이것은 로케일에 따라 다릅니다. 9 988 776,65 € 프랑스에서 9.988.776,65 € 독일에서 $ 9,988,776.65 미국
Alexandru R

소스 코드에 상수를 작성하고 쉼표를 사용하여 더 읽기 쉽게 만들려면 로케일이 아닌 다른 위치에서 코드가 실패하게 만드는 방법입니다. python cd_size = float("737,280,000".replace(',','')) (실제로 int 사용)
hum3

소스 코드에 문자열 리터럴 상수를 작성한 다음이를 정수 또는 부동 소수점으로 명시 적으로 변환하는 경우 이는 디자인에 문제가 있다는 신호입니다. 그러나 방어 할 수 있더라도 해당 컨텍스트에 대해 코드가 작성된 로캘을 임시로 설정 한 다음 사용자 입력을 처리 할 때 사용자에게 적합한 컨텍스트를 복원하십시오. 그것이 setlocale애초에있는 이유 입니다.
Karl Knechtel

이렇게하지 마세요. "123 ,,,, 345"와 같은 것을 허용합니다
amohr

152

... 또는 쉼표를 필터링 할 쓰레기로 처리하는 대신 전체 문자열을 float의 현지화 된 형식으로 처리하고 현지화 서비스를 사용할 수 있습니다.

from locale import atof, setlocale, LC_NUMERIC
setlocale(LC_NUMERIC, '') # set to your default locale; for me this is
# 'English_Canada.1252'. Or you could explicitly specify a locale in which floats
# are formatted the way that you describe, if that's not how your locale works :)
atof('123,456') # 123456.0
# To demonstrate, let's explicitly try a locale in which the comma is a
# decimal point:
setlocale(LC_NUMERIC, 'French_Canada.1252')
atof('123,456') # 123.456

4
지금까지 가장 비단뱀적이고 직관적 인 방법. +1
Aufwind 2011

2
예제에 소수점과 숫자 그룹화 문자가 모두 포함되어 있다면이 답변을 찬성합니다.
martineau 2011-07-09

14
스크립트에는 Extension modules should never call setlocale()
좋지만

13
@wanderer : 더 이상 사용되지 않는 것은 atof strings내장 메서드입니다 . 여기서 제가 사용 atof하고있는 것은 locale표준 라이브러리 모듈 의 함수 로, 전혀 사용되지 않습니다.
Karl Knechtel 2015 년

5
그렇기 때문에 스타 가져 오기가 나쁘지 않습니다. 필요한 것을 가져 오거나 더 나은 네임 스페이스를 가져 오도록이 파일을 편집하는 것이 좋습니다.locale.atof
Mr_and_Mrs_D

8

로케일을 모르고 모든 종류의 숫자를 구문 분석하려면 parseNumber(text)함수를 사용 하십시오 . 완벽하지는 않지만 대부분의 경우를 고려하십시오.

>>> parseNumber("a 125,00 €")
125
>>> parseNumber("100.000,000")
100000
>>> parseNumber("100 000,000")
100000
>>> parseNumber("100,000,000")
100000000
>>> parseNumber("100 000 000")
100000000
>>> parseNumber("100.001 001")
100.001
>>> parseNumber("$.3")
0.3
>>> parseNumber(".003")
0.003
>>> parseNumber(".003 55")
0.003
>>> parseNumber("3 005")
3005
>>> parseNumber("1.190,00 €")
1190
>>> parseNumber("1190,00 €")
1190
>>> parseNumber("1,190.00 €")
1190
>>> parseNumber("$1190.00")
1190
>>> parseNumber("$1 190.99")
1190.99
>>> parseNumber("1 000 000.3")
1000000.3
>>> parseNumber("1 0002,1.2")
10002.1
>>> parseNumber("")

>>> parseNumber(None)

>>> parseNumber(1)
1
>>> parseNumber(1.1)
1.1
>>> parseNumber("rrr1,.2o")
1
>>> parseNumber("rrr ,.o")

>>> parseNumber("rrr1rrr")
1

7

소수점 구분 기호로 쉼표를 사용하고 천 단위 구분 기호로 점을 사용하는 경우 다음을 수행 할 수 있습니다.

s = s.replace('.','').replace(',','.')
number = float(s)

도움이되기를 바랍니다.


6

이건 어때?

 my_string = "123,456.908"
 commas_removed = my_string.replace(',', '') # remove comma separation
 my_float = float(commas_removed) # turn from string to float.

요컨대 :

my_float = float(my_string.replace(',', ''))


2

여기 내가 당신을 위해 쓴 간단한 방법이 있습니다. :)

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908

re그러한 작업에 큰 망치입니다.
Roman Bodnarchuk 2011

@John Doe : 이제 훨씬 좋아 보입니다. float(number)설명적인 터치 때문에 좋아 합니다. +1 ;-)
Aufwind 2011-07-09

2
9 988 776,65 € (프랑스) 9.988.776,65 € (독일) $ 9,988,776.65 (미국) ----> 작동합니까?
Alexandru R

1

그냥 교체 ,교체로 ().

f = float("123,456.908".replace(',','')) print(type(f)

type ()은 그것이 float로 변환되었음을 보여줍니다.


1

다양한 통화 형식에 대한 더 나은 솔루션 :

def text_currency_to_float(text):
  t = text
  dot_pos = t.rfind('.')
  comma_pos = t.rfind(',')
  if comma_pos > dot_pos:
    t = t.replace(".", "")
    t = t.replace(",", ".")
  else:
    t = t.replace(",", "")

  return(float(t))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.