[python] 문자열을 float 또는 int로 구문 분석하는 방법은 무엇입니까?

파이썬에서 어떻게 "545.2222"대응하는 float 값 과 같은 숫자 문자열을 구문 분석 할 수 545.2222있습니까? 또는 문자열 "31"을 정수로 구문 분석하십시오 31.

방금 float str 을 로 구문 분석하고 intfloat(별도로) 구문 분석하는 방법을 알고 싶습니다 . strint



답변

>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545


답변

def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)


답변

문자열이 부동인지 확인하는 Python 메소드 :

def is_float(value):
  try:
    float(value)
    return True
  except:
    return False

이 기능에 대한 더 길고 정확한 이름은 다음과 같습니다. is_convertible_to_float(value)

무엇이며,의 float 아닌 파이썬 당신을 놀라게 수 있습니다 :

val                   is_float(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

당신은 당신이 어떤 숫자인지 알고 있다고 생각합니까? 당신은 생각만큼 좋지 않습니다! 큰 놀라움이 아닙니다.

생명에 중요한 소프트웨어에서는이 코드를 사용하지 마십시오!

이런 식으로 광범위한 예외를 잡아 내고 카나리아를 죽이고 예외를 흔들면 유효한 float가 문자열로 false가 반환 될 가능성이 적습니다. float(...)코드 라인은 문자열의 내용과는 아무 상관이없는 천 이유로 실패 할 수 있습니다. 그러나 파이썬과 같은 오리 형 프로토 타입 언어로 생명에 중요한 소프트웨어를 작성하는 경우 훨씬 더 큰 문제가 있습니다.


답변

이것은 ast.literal_eval에서 언급할만한 또 다른 방법입니다 .

값을 직접 구문 분석 할 필요없이 신뢰할 수없는 소스의 Python 표현식을 포함하는 문자열을 안전하게 평가하는 데 사용할 수 있습니다.

즉, 안전한 ‘평가’

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31


답변

float(x) if '.' in x else int(x)


답변

현지화 및 쉼표

float("545,545.2222")예외를 발생시키는 경우와 같이 숫자의 문자열 표현에서 쉼표의 가능성을 고려해야합니다 . 대신에 메서드를 사용 locale하여 문자열을 숫자로 변환하고 쉼표를 올바르게 해석하십시오. 그만큼locale.atof로케일 번에 한 단계 플로트에있어서의 변환은 원하는 수의 규칙 설정되어있다.

예 1-미국 번호 규칙

미국과 영국에서는 쉼표를 천 단위 구분 기호로 사용할 수 있습니다. 미국 로케일의이 예에서 쉼표는 구분 기호로 올바르게 처리됩니다.

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

예 2-유럽 번호 규칙

에서 세계의 국가의 대부분의 쉼표 소수점 마크 대신 기간에 사용됩니다. 프랑스어 로케일이있는이 예에서 쉼표는 소수점으로 올바르게 처리됩니다.

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

이 방법 locale.atoi도 사용할 수 있지만 인수는 정수 여야합니다.


답변

타사 모듈을 사용하지 않으려면 fastnumbers 모듈을 확인하십시오 . 이 질문이 요구하는 것을 정확하게 수행하고 pure-Python 구현보다 빠르게 수행하는 fast_real 이라는 함수를 제공합니다 .

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int