如何在Python中检查字符串是否表示数值?

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

上述方法可行,但似乎很笨拙。


如果您正在测试的内容来自用户输入,那么即使它表示int或float,它仍然是一个字符串。请参阅如何将输入读取为数字?用于转换输入,并询问用户输入,直到他们给出有效响应以确保输入在继续之前表示int或float(或其他要求)。


当前回答

因此,将所有这些放在一起,检查Nan、无穷大和复数(看起来它们是用j指定的,而不是i,即1+2j),结果是:

def is_number(s):
    try:
        n=str(float(s))
        if n == "nan" or n=="inf" or n=="-inf" : return False
    except ValueError:
        try:
            complex(s) # for complex
        except ValueError:
            return False
    return True

其他回答

该答案提供了一步一步的指导,具有查找字符串的示例:

正整数正/负-整数/浮点如何在检查数字时丢弃“NaN”(不是数字)字符串?

检查字符串是否为正整数

您可以使用str.idigit()检查给定的字符串是否为正整数。

样本结果:

# For digit
>>> '1'.isdigit()
True
>>> '1'.isalpha()
False

检查字符串是否为正/负-整数/浮点

如果字符串是负数或浮点数,str.isdigit()返回False。例如:

# returns `False` for float
>>> '123.3'.isdigit()
False
# returns `False` for negative number
>>> '-123'.isdigit()
False

如果您还想检查负整数和浮点数,那么您可以编写一个自定义函数来检查它,如下所示:

def is_number(n):
    try:
        float(n)   # Type-casting the string to `float`.
                   # If string is not a valid `float`, 
                   # it'll raise `ValueError` exception
    except ValueError:
        return False
    return True

样品运行:

>>> is_number('123')    # positive integer number
True

>>> is_number('123.4')  # positive float number
True
 
>>> is_number('-123')   # negative integer number
True

>>> is_number('-123.4') # negative `float` number
True

>>> is_number('abc')    # `False` for "some random" string
False

检查数字时放弃“NaN”(非数字)字符串

上述函数将为“NAN”(非数字)字符串返回True,因为对于Python,它是表示它不是数字的有效浮点数。例如:

>>> is_number('NaN')
True

为了检查数字是否为“NaN”,可以使用math.isnan()作为:

>>> import math
>>> nan_num = float('nan')

>>> math.isnan(nan_num)
True

或者,如果您不想导入其他库来检查它,那么您可以通过使用==将其与自身进行比较来检查它。当nan float与自身比较时,Python返回False。例如:

# `nan_num` variable is taken from above example
>>> nan_num == nan_num
False

因此,上述函数is_number可以更新为“NaN”返回False,如下所示:

def is_number(n):
    is_number = True
    try:
        num = float(n)
        # check for "nan" floats
        is_number = num == num   # or use `math.isnan(num)`
    except ValueError:
        is_number = False
    return is_number

样品运行:

>>> is_number('Nan')   # not a number "Nan" string
False

>>> is_number('nan')   # not a number string "nan" with all lower cased
False

>>> is_number('123')   # positive integer
True

>>> is_number('-123')  # negative integer
True

>>> is_number('-1.12') # negative `float`
True

>>> is_number('abc')   # "some random" string
False

PS:根据号码类型,每次检查的每次操作都会产生额外的开销。选择符合您需求的is_number函数版本。

通过返回比True和False更有用的值,可以以有用的方式概括异常技术。例如,此函数将引号放在字符串周围,但不使用数字。这正是我需要的快速而肮脏的过滤器来为R定义一些变量。

import sys

def fix_quotes(s):
    try:
        float(s)
        return s
    except ValueError:
        return '"{0}"'.format(s)

for line in sys.stdin:
    input = line.split()
    print input[0], '<- c(', ','.join(fix_quotes(c) for c in input[1:]), ')'

在浮点数的最常见情况下,我们希望处理整数和小数。让我们以字符串“1.1”为例。

我会尝试以下方法之一:

1.>isnumeric()

word = "1.1"

"".join(word.split(".")).isnumeric()
>>> True

2.>isdigit()

word = "1.1"

"".join(word.split(".")).isdigit()
>>> True

3.>isdecimal()

word = "1.1"

"".join(word.split(".")).isdecimal()
>>> True

速度:

► 所有上述方法具有相似的速度。

%timeit "".join(word.split(".")).isnumeric()
>>> 257 ns ± 12 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit "".join(word.split(".")).isdigit()
>>> 252 ns ± 11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit "".join(word.split(".")).isdecimal()
>>> 244 ns ± 7.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

我也有类似的问题。我想将字符串列表转换为浮点数,而不是定义isNumber函数,这在高级术语中是:

[ float(s) for s in list if isFloat(s)]

在给定的情况下,我们不能真正将float与isFloat函数分开:这两个结果应该由同一个函数返回。此外,如果float失败,整个过程将失败,而不仅仅是忽略错误元素。此外,“0”是一个有效的数字,应包含在列表中。当过滤掉坏元素时,一定不要排除0。

因此,必须以某种方式修改上述理解:

如果列表中的任何元素都无法转换,请忽略它并不要引发异常避免为每个元素多次调用float(一个用于转换,另一个用于测试)如果转换后的值为0,则它仍应出现在最终列表中

我提出了一个以C#的可空数值类型为灵感的解决方案。这些类型在内部由一个结构表示,该结构具有数值,并添加一个布尔值,指示该值是否有效:

def tryParseFloat(s):
    try:
        return(float(s), True)
    except:
        return(None, False)

tupleList = [tryParseFloat(x) for x in list]
floats = [v for v,b in tupleList if b]

我正在研究一个问题,这个问题使我想到了这个主题,即如何以最直观的方式将一组数据转换为字符串和数字。在阅读原始代码后,我意识到我需要的东西在两个方面有所不同:

1-如果字符串表示整数,我希望得到整数结果

2-我想要一个数字或字符串结果粘贴到数据结构中

所以我修改了原始代码来生成这个派生代码:

def string_or_number(s):
    try:
        z = int(s)
        return z
    except ValueError:
        try:
            z = float(s)
            return z
        except ValueError:
            return s