在Python中检查字符串是否可以转换为浮点数

295

我有一些Python代码,它会遍历一个字符串列表并将它们转换为整数或浮点数(如果可能的话)。对于整数,这很容易实现。

if element.isdigit():
  newelement = int(element)

浮点数更难处理。目前我正在使用 partition('.') 来分割字符串,并检查一侧或两侧是否为数字。

partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit()) 
    or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit()) 
    or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
  newelement = float(element)

这个方法可行,但是显然if语句有点复杂。我考虑的另一个解决方案是用try/catch代码块来尝试转换并查看是否成功,就像这个问题中描述的那样。

大家有其他的想法吗?对分隔符和try/catch方法的优劣有什么看法?


准确地说,在Python中并不存在类型转换这样的概念。因此,标签“type-conversion”是误导性的,而在某些语言中,它是一个明确定义的术语。 - user5538922
@bombs 没有类型转换?那这是什么:print(type("1"));print(type(int("1"))),输出:<class 'str'> <class 'int'>?这不是从 strint 的类型转换吗? - ggorlen
@ggorlen 一点也不。你只是从其他对象创建新对象。沿途在堆中分配新的内存空间。没有任何转换。 - user5538922
1
我明白你的意思,但那似乎有点学究了。如果有人说“将字符串转换为浮点数”,意图似乎是非常普遍清晰的。 - ggorlen
你为什么使用.isdigit()而不是.isnumeric()来判断正整数? - Charlie Parker
24个回答

0

这是一个简单而有趣的问题。下面呈现的解决方案对我来说很有效:

import re

val = "25,000.93$"

regex = r"\D"

splitted = re.split(regex, val)
splitted = list(filter(str.isdecimal, splitted))

if splitted:
    if len(splitted) > 1:
        splitted.insert(-1, ".")

    try:
        f = float("".join(splitted))
        print(f, "is float.")
        
    except ValueError:
        print("Not a float.")
        
else:
    print("Not a float.")

重要提示:该解决方案基于假设,在splitted中的最后一个值包含小数位。


0

我找到了一种可能也能行的方法。需要验证一下。第一次在这里发布东西。

def isfloat(a_str):
    try:
        x=float(a_str)
        if x%1 == 0:
            return False
        elif x%1 != 0: #an else also do
            return True
    except Exception as error:
            return False

-2
我们可以使用正则表达式来判断一个字符串是否为浮点数或整数,代码如下: import re if re.match('[0-9]*\.?[0-9]+', <your_string>): print("这是一个浮点数或整数") else: print("这是一些奇怪的东西") 现在,让我用英语解释一下这个正则表达式:
  • * -> 0或多次出现
  • + -> 1或多次出现
  • ? -> 0/1次出现
接下来,我们将其转换为以下形式:
  • '[0-9]*' -> 0或多次出现数字0-9之间的数字
  • \.? -> 接下来是0或1个点号(如果您需要检查它是否为整数或浮点数,可以使用{1}代替?)
  • [0-9]+ -> 接下来是0或多次出现数字0-9之间的数字

-4
str(strval).isdigit()

看起来很简单。

处理存储为字符串、整数或浮点数的值。


在[2]:'123,123'.isdigit() 输出[2]:False - Danil
1
它不能处理负数字面量,请修正你的答案。 - RandomEli
'39.1'.isdigit() - Ohad the Lad
如果您正在寻找更完整的实现,请使用以下代码:all([x.isdigit() for x in str(VAR).strip('-').replace(',','.').split('.')]) - lotrus28

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