Как мне разобрать строку в float или int? - PullRequest
2009 голосов
/ 19 декабря 2008

Как в Python разобрать числовую строку, например "545.2222", в соответствующее значение с плавающей запятой, 545.2222? Или разобрать строку "31" в целое число, 31?

Я просто хочу знать, как разобрать float str в float и (отдельно) int str в int.

Ответы [ 22 ]

15 голосов
/ 19 декабря 2008

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

13 голосов
/ 16 апреля 2013

Синтаксический анализатор YAML может помочь вам определить тип данных вашей строки. Используйте yaml.load(), а затем вы можете использовать type(result) для проверки типа:

>>> import yaml

>>> a = "545.2222"
>>> result = yaml.load(a)
>>> result
545.22220000000004
>>> type(result)
<type 'float'>

>>> b = "31"
>>> result = yaml.load(b)
>>> result
31
>>> type(result)
<type 'int'>

>>> c = "HI"
>>> result = yaml.load(c)
>>> result
'HI'
>>> type(result)
<type 'str'>
13 голосов
/ 09 июля 2017

Я использую эту функцию для этого

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
11 голосов
/ 08 октября 2015
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
8 голосов
/ 09 октября 2015
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')
6 голосов
/ 21 октября 2010

Вы должны принять во внимание округление, чтобы сделать это правильно.

т.е. int (5.1) => 5 int (5.6) => 5 - неправильно, должно быть 6, поэтому мы делаем int (5.6 + 0.5) => 6

def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)
5 голосов
/ 12 июля 2017

Я удивлен, что никто не упомянул регулярное выражение, потому что иногда строка должна быть подготовлена ​​и нормализована перед приведением к числу

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
4 голосов
/ 01 июля 2018

Для типизации в Python используйте функции конструктора типа, передавая строку (или любое значение, которое вы пытаетесь привести) в качестве параметра.

Например:

>>>float("23.333")
   23.333

За кулисами python вызывает метод __float__ объектов, который должен возвращать плавающее представление параметра. Это особенно полезно, так как вы можете определять свои собственные типы (используя классы) с помощью метода __float__, чтобы его можно было преобразовать в float с помощью float (myobject).

3 голосов
/ 18 мая 2017

Это исправленная версия из https://stackoverflow.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
1 голос
/ 09 октября 2016

Использование:

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

Это самый Pythonic способ, которым я мог придумать.

...