python - 확인 - 파이썬 실수를 정수로




파이썬에서 문자열을 float 또는 int로 구문 분석하는 방법은 무엇입니까? (16)

Python에서 "545.2222" 와 같은 숫자 문자열을 해당 부동 소수점 값인 542.2222 어떻게 542.2222 합니까? 또는 문자열 "31" 을 정수 "31" 구문 분석 하시겠습니까?

float string 을 구문 분석하여 float string 로, int stringint 로 구문 분석하는 방법을 알고 싶습니다.


Python에서 "545.2222"와 같은 숫자 문자열을 해당 부동 소수점 값인 542.2222로 파싱하려면 어떻게해야합니까? 또는 문자열 "31"을 정수 31로 구문 분석 하시겠습니까? float 문자열을 구문 분석하여 float 문자열로, int 문자열을 int로 구문 분석하는 방법을 알고 싶습니다.

이 작업을 별도로 수행하는 것이 좋습니다. 혼합하는 경우 나중에 문제가 생길 수 있습니다. 간단한 대답은 다음과 같습니다.

"545.2222" to float :

>>> float("545.2222")
545.2222

"31" 을 정수로 변환 :

>>> int("31")
31

기타 변환, 문자열과 리터럴 간의 int :

다양한 기지에서의 전환. 미리 기지를 알아야합니다 (기본값은 10입니다). Python이 리터럴 (아래 참조)을 기대하거나 접두사를 제거하기 위해 접두어를 사용할 수 있습니다.

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

사전을 미리 알지 못하지만 올바른 접두사를 가질 것이라는 것을 알고 있다면, 0 을 기본으로 전달하면 Python이이를 유추 할 수 있습니다.

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

다른베이스의 10 진수가 아닌 (즉, 정수) 리터럴

그러나 자신의 코드가 하드 코딩 된 특정 값을 명확하게 나타내도록하려는 경우, 기반에서 변환 할 필요가 없을 수도 있습니다. 파이썬이 올바른 구문으로 자동으로 수행하도록 할 수 있습니다.

apropos 접두사를 사용 하여 다음 리터럴 로 정수로 자동 변환 할 수 있습니다. 파이썬 2와 3에서 유효합니다 :

바이너리, 프리픽스 0b

>>> 0b11111
31

8 진수, 접두사 0o

>>> 0o37
31

16 진수, 접두사 0x

>>> 0x1f
31

바이너리 플래그, 코드의 파일 사용 권한 또는 색상의 16 진수 값을 설명 할 때 유용 할 수 있습니다 (예 : no quotes 참고).

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

모호한 파이썬 2 옥텟을 파이썬 3과 호환되게 만들기

파이썬 2에서 0으로 시작하는 정수를 보면, 이것은 (더 이상 사용되지 않는) 8 진법 구문입니다.

>>> 037
31

값이 37 것처럼 보이기 때문에 나쁘다. 그래서 파이썬 3에서는 SyntaxError :

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

파이썬 2 옥텟을 2와 3 모두에서 0o 접두어로 작동하는 8 진수로 변환하십시오 :

>>> 0o37
31

문자열이 float인지 확인하는 Python 메서드입니다.

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

이 함수의 더 길고 정확한 이름은 다음과 같습니다. is_convertible_to_float(value)

Python 에서 무엇이 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

숫자가 뭔지 알 것 같니? 당신 생각만큼 좋지는 않아! 큰 놀라움이 아닙니다.


나는이 함수를 사용한다.

import ast

def parse_str(s):
   try:
      return ast.literal_eval(str(s))
   except:
      return

문자열을 해당 유형으로 변환합니다.

value = parse_str('1')  # Returns Integer
value = parse_str('1.5')  # Returns Float

때론 문자열을 준비하고 숫자에 캐스팅하기 전에 정규화해야하기 때문에 정규 표현식을 언급하지 않은 사람은 놀랍습니다.

import re
def parseNumber(value, as_int=False):
    try:
        number = float(re.sub('[^.\-\d]', '', value))
        if as_int:
            return int(number + 0.5)
        else:
            return number
    except ValueError:
        return float('nan')  # or None if you wish

용법:

parseNumber('13,345')
> 13345.0

parseNumber('- 123 000')
> -123000.0

parseNumber('99999\n')
> 99999.0

그런데 숫자가 있다는 것을 확인하는 무언가가 있습니다.

import numbers
def is_number(value):
    return isinstance(value, numbers.Number)
    # will work with int, float, long, Decimal

용도:

def num(s):
    try:
        for each in s:
            yield int(each)
    except ValueError:
        yield float(each)
a = num(["123.55","345","44"])
print a.next()
print a.next()

이것은 제가 생각해 낼 수있는 가장 평범한 방법입니다.


이것은 여기서 언급 할 가치가있는 또 다른 방법입니다. ast.literal_eval :

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

즉, 안전한 '평가'

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

제 3 자 모듈을 싫어하지 않으면 fastnumbers 모듈을 체크 아웃 할 수 있습니다. fast_real 이라는 함수를 제공합니다.이 함수는이 질문에 정확히 무엇을 요구하며 순수한 Python 구현보다 빠릅니다.

>>> 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

질문에 대한 또 다른 해석이 있습니다 (힌트 : 모호합니다). 다음과 같은 것을 찾는 것이 가능합니다.

def parseIntOrFloat( aString ):
    return eval( aString )

그것은 이렇게 작동합니다 ...

>>> parseIntOrFloat("545.2222")
545.22220000000004
>>> parseIntOrFloat("545")
545

이론적으로, 주사 취약점이 있습니다. 문자열은 예를 들어 "import os; os.abort()" 있습니다. 그러나 끈이 어디에서 왔는지에 대한 배경 지식이 없으면 이론적 추론이 가능하다. 질문이 모호하기 때문에이 취약점이 실제로 존재하는지 여부는 명확하지 않습니다.


파이썬에서 타입 변환하려면 형식의 생성자 funtions를 사용하고 문자열 (또는 캐스팅하려는 모든 값)을 매개 변수로 전달하십시오.

예 :

>>>float("23.333")
   23.333

그 뒤에는 python이 __float__ 메서드를 호출하여 매개 변수의 float 표현을 반환해야합니다. float (myobject)를 사용하여 float에 캐스팅 할 수 있도록 __float__ 메소드로 클래스를 사용하여 자신의 유형을 정의 할 수 있으므로 특히 강력합니다.


파이썬은 하나의 라이너에서 이처럼 뛰어난 분석 기능을 제공합니다.

str = "545.2222"
print ("int: ", + int(float(a)))
print ("float: ", +(float(a)))

float("545.2222")int(float("545.2222"))


str() 을 사용하여 임의의 변수를 문자열로 변환하고 int() 를 사용하여 문자열 정수를 정수로 변환하고 float() 을 사용하여 문자열 부동 소수를 float 값으로 변환 할 수 있습니다.

str_to_float = float("545.2222")
str_to_int = int("31")

이것은 https://.com/a/33017514/5973334 의 수정 된 버전 입니다.

이렇게하면 문자열을 구문 분석하고 문자열이 나타내는 내용에 따라 int 또는 float 중 하나를 반환합니다. 구문 분석 예외가 발생하거나 예기치 않은 동작이 발생할 수 있습니다 .

  def get_int_or_float(v):
        number_as_float = float(v)
        number_as_int = int(number_as_float)
        return number_as_int if number_as_float == number_as_int else 
        number_as_float

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

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

def num(s):
"""num(s)
num(3),num(3.7)-->3
num('3')-->3, num('3.7')-->3.7
num('3,700')-->ValueError
num('3a'),num('a3'),-->ValueError
num('3e4') --> 30000.0
"""
try:
    return int(s)
except ValueError:
    try:
        return float(s)
    except ValueError:
        raise ValueError('argument is not a string of number')




integer