如何将字符串解析为浮点数或整数?

2719

19
通常情况下,如果你在Python中有一个对象,并且想将其转换为该类型的对象,请对其调用 type(my_object)。结果通常可以作为函数调用来执行转换。例如,type(100) 的结果是 int,因此你可以调用 int(my_object) 来尝试将 my_object 转换为整数。这种方法并不总是可行的,但在编码时是一个好的“第一推荐”。 - robertlayton
还要确保该字符串实际上可以转换为浮点数。做到这一点的一种方法是编写一个带有try/except块的自定义函数,检查try范围内是否包含return float(str_value) - InfiniteStack
33个回答

19

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


1
如果你的字符串恰好是“0”或“0.0”,它将返回一个浮点对象,而不是其他有效数字所返回的整数。 - Brian

19

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

这是一个很棒的答案(或者 json 或者任何你喜欢的格式):我们都认识到正确的转换并不容易。所以,找到一个被广泛采用的库来为您管理这个问题吧。 :) - Mike Williamson
JSON 可以很好地工作,但如果传递了一个字符串,它只会引发 TypeError,因此需要一些自定义处理或预检查来避免一些尝试。就像我使用了一些正则表达式:https://dev59.com/8VYN5IYBdhLWcg3w7cJn#69790897 - Rafe

15

我用这个函数来做那个事情

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

2
请注意,parse_str(' 1')(带有空格)将返回None而不是1 - musiphil

11
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
如果你在except部分什么也不做,为什么要引发异常呢?float()会自动引发异常。 - Greg0ry
1
你是对的,我猜我从一个引发特定异常的功能中复制并粘贴了代码。我会进行编辑。谢谢。 - Totoro
1
这将尝试解析一个字符串,并根据字符串表示的内容返回intfloat。它可能会引发解析异常或具有一些意外行为。 - Kuzeko

10
你可以使用 json.loads:
>>> import json
>>> json.loads('123.456')
123.456
>>> type(_)
<class 'float'>
>>> 

正如您所看到的,它变成了一种浮点数类型。


9
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')

8

您需要考虑四舍五入才能正确地做到这一点。

例如 - 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)

4
好的,那样做会导致通货膨胀,因此 Python 3其他现代编程语言 使用银行家舍入法。 - Cees Timmerman
2
这个答案是错误的(原始写法),它混淆了intfloat两种情况。而且当n是字符串时,会引发异常,这正是OP所期望的。也许你的意思是:当需要一个int结果时,应该在转换为浮点数之后执行round。如果函数应该总是返回一个整数,那么你不需要except部分——整个函数体可以是int(round(float(input)))。如果函数应该尽可能返回一个整数,否则返回一个浮点数,那么javier的原始解决方案是正确的! - ToolmakerSteve
ValueError: 无法将字符串转换为浮点数 - Avi Thour

7

有时候字符串在转换为数字之前需要进行准备和规范化,因此还需要使用正则表达式:

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

6

要在Python中进行类型转换,使用类型的构造函数,并将字符串(或您尝试转换的任何值)作为参数传递。

例如:

>>>float("23.333")
   23.333

在幕后,Python调用对象的__float__方法,该方法应返回参数的浮点表示。这是特别强大的,因为您可以使用类定义自己的类型,并带有__float__方法,以便可以使用float(myobject)将其转换为浮点数。

6
将您的字符串传递给此函数:
def string_to_number(str):
  if("." in str):
    try:
      res = float(str)
    except:
      res = str
  elif(str.isdigit()):
    res = int(str)
  else:
    res = str
  return(res)

根据传入的参数类型,它将返回int、float或string。

是整数的字符串

print(type(string_to_number("124")))
<class 'int'>

代表浮点数的字符串

print(type(string_to_number("12.4")))
<class 'float'>

字符串是一个字符串

print(type(string_to_number("hello")))
<class 'str'>

类似浮点数的字符串

print(type(string_to_number("hel.lo")))
<class 'str'>

3
看到名称string_to_number时,我不会期望它返回一个字符串。如果输入无法解析,我会期望它引发异常。 - Neuron
1
我认为一个名为string_to_number的方法不应该返回一个字符串,这并不是一个有争议的观点。我点了踩是因为函数要么命名不当,要么行为错误。此外,没有必要被消极攻击。我们可以以专业方式交流。 - Neuron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接