How do I check if a string is a number (float)?

后端 未结 30 3917
暗喜
暗喜 2020-11-21 05:16

What is the best possible way to check if a string can be represented as a number in Python?

The function I currently have right now is:

def is_numb         


        
相关标签:
30条回答
  • 2020-11-21 05:54

    I did some speed test. Lets say that if the string is likely to be a number the try/except strategy is the fastest possible.If the string is not likely to be a number and you are interested in Integer check, it worths to do some test (isdigit plus heading '-'). If you are interested to check float number, you have to use the try/except code whitout escape.

    0 讨论(0)
  • 2020-11-21 05:54

    I was working on a problem that led me to this thread, namely how to convert a collection of data to strings and numbers in the most intuitive way. I realized after reading the original code that what I needed was different in two ways:

    1 - I wanted an integer result if the string represented an integer

    2 - I wanted a number or a string result to stick into a data structure

    so I adapted the original code to produce this derivative:

    def string_or_number(s):
        try:
            z = int(s)
            return z
        except ValueError:
            try:
                z = float(s)
                return z
            except ValueError:
                return s
    
    0 讨论(0)
  • 2020-11-21 05:56

    In case you are looking for parsing (positive, unsigned) integers instead of floats, you can use the isdigit() function for string objects.

    >>> a = "03523"
    >>> a.isdigit()
    True
    >>> b = "963spam"
    >>> b.isdigit()
    False
    

    String Methods - isdigit(): Python2, Python3

    There's also something on Unicode strings, which I'm not too familiar with Unicode - Is decimal/decimal

    0 讨论(0)
  • 2020-11-21 05:56

    str.isnumeric()

    Return True if all characters in the string are numeric characters, and there is at least one character, False otherwise. Numeric characters include digit characters, and all characters that have the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION ONE FIFTH. Formally, numeric characters are those with the property value Numeric_Type=Digit, Numeric_Type=Decimal or Numeric_Type=Numeric.

    str.isdecimal()

    Return True if all characters in the string are decimal characters and there is at least one character, False otherwise. Decimal characters are those that can be used to form numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal character is a character in the Unicode General Category “Nd”.

    Both available for string types from Python 3.0.

    0 讨论(0)
  • 2020-11-21 05:57

    The input may be as follows:

    a="50" b=50 c=50.1 d="50.1"


    1-General input:

    The input of this function can be everything!

    Finds whether the given variable is numeric. Numeric strings consist of optional sign, any number of digits, optional decimal part and optional exponential part. Thus +0123.45e6 is a valid numeric value. Hexadecimal (e.g. 0xf4c3b00c) and binary (e.g. 0b10100111001) notation is not allowed.

    is_numeric function

    import ast
    import numbers              
    def is_numeric(obj):
        if isinstance(obj, numbers.Number):
            return True
        elif isinstance(obj, str):
            nodes = list(ast.walk(ast.parse(obj)))[1:]
            if not isinstance(nodes[0], ast.Expr):
                return False
            if not isinstance(nodes[-1], ast.Num):
                return False
            nodes = nodes[1:-1]
            for i in range(len(nodes)):
                #if used + or - in digit :
                if i % 2 == 0:
                    if not isinstance(nodes[i], ast.UnaryOp):
                        return False
                else:
                    if not isinstance(nodes[i], (ast.USub, ast.UAdd)):
                        return False
            return True
        else:
            return False
    

    test:

    >>> is_numeric("54")
    True
    >>> is_numeric("54.545")
    True
    >>> is_numeric("0x45")
    True
    

    is_float function

    Finds whether the given variable is float. float strings consist of optional sign, any number of digits, ...

    import ast
    
    def is_float(obj):
        if isinstance(obj, float):
            return True
        if isinstance(obj, int):
            return False
        elif isinstance(obj, str):
            nodes = list(ast.walk(ast.parse(obj)))[1:]
            if not isinstance(nodes[0], ast.Expr):
                return False
            if not isinstance(nodes[-1], ast.Num):
                return False
            if not isinstance(nodes[-1].n, float):
                return False
            nodes = nodes[1:-1]
            for i in range(len(nodes)):
                if i % 2 == 0:
                    if not isinstance(nodes[i], ast.UnaryOp):
                        return False
                else:
                    if not isinstance(nodes[i], (ast.USub, ast.UAdd)):
                        return False
            return True
        else:
            return False
    

    test:

    >>> is_float("5.4")
    True
    >>> is_float("5")
    False
    >>> is_float(5)
    False
    >>> is_float("5")
    False
    >>> is_float("+5.4")
    True
    

    what is ast?


    2- If you are confident that the variable content is String:

    use str.isdigit() method

    >>> a=454
    >>> a.isdigit()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'int' object has no attribute 'isdigit'
    >>> a="454"
    >>> a.isdigit()
    True
    

    3-Numerical input:

    detect int value:

    >>> isinstance("54", int)
    False
    >>> isinstance(54, int)
    True
    >>> 
    

    detect float:

    >>> isinstance("45.1", float)
    False
    >>> isinstance(45.1, float)
    True
    
    0 讨论(0)
  • 2020-11-21 05:59

    RyanN suggests

    If you want to return False for a NaN and Inf, change line to x = float(s); return (x == x) and (x - 1 != x). This should return True for all floats except Inf and NaN

    But this doesn't quite work, because for sufficiently large floats, x-1 == x returns true. For example, 2.0**54 - 1 == 2.0**54

    0 讨论(0)
提交回复
热议问题