How do I parse a string to a float or int?

后端 未结 29 2768
醉话见心
醉话见心 2020-11-21 04:43

In Python, how can I parse a numeric string like \"545.2222\" to its corresponding float value, 545.2222? Or parse the string \"31\" t

相关标签:
29条回答
  • 2020-11-21 04:58

    Use:

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

    This is the most Pythonic way I could come up with.

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

    The question seems a little bit old. But let me suggest a function, parseStr, which makes something similar, that is, returns integer or float and if a given ASCII string cannot be converted to none of them it returns it untouched. The code of course might be adjusted to do only what you want:

       >>> import string
       >>> parseStr = lambda x: x.isalpha() and x or x.isdigit() and \
       ...                      int(x) or x.isalnum() and x or \
       ...                      len(set(string.punctuation).intersection(x)) == 1 and \
       ...                      x.count('.') == 1 and float(x) or x
       >>> parseStr('123')
       123
       >>> parseStr('123.3')
       123.3
       >>> parseStr('3HC1')
       '3HC1'
       >>> parseStr('12.e5')
       1200000.0
       >>> parseStr('12$5')
       '12$5'
       >>> parseStr('12.2.2')
       '12.2.2'
    
    0 讨论(0)
  • 2020-11-21 05:00

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

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

    Localization and commas

    You should consider the possibility of commas in the string representation of a number, for cases like float("545,545.2222") which throws an exception. Instead, use methods in locale to convert the strings to numbers and interpret commas correctly. The locale.atof method converts to a float in one step once the locale has been set for the desired number convention.

    Example 1 -- United States number conventions

    In the United States and the UK, commas can be used as a thousands separator. In this example with American locale, the comma is handled properly as a separator:

    >>> import locale
    >>> a = u'545,545.2222'
    >>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
    'en_US.UTF-8'
    >>> locale.atof(a)
    545545.2222
    >>> int(locale.atof(a))
    545545
    >>>
    

    Example 2 -- European number conventions

    In the majority of countries of the world, commas are used for decimal marks instead of periods. In this example with French locale, the comma is correctly handled as a decimal mark:

    >>> import locale
    >>> b = u'545,2222'
    >>> locale.setlocale(locale.LC_ALL, 'fr_FR')
    'fr_FR'
    >>> locale.atof(b)
    545.2222
    

    The method locale.atoi is also available, but the argument should be an integer.

    0 讨论(0)
  • 2020-11-21 05:02
    def num(s):
        try:
            return int(s)
        except ValueError:
            return float(s)
    
    0 讨论(0)
  • 2020-11-21 05:02

    I am surprised nobody mentioned regex because sometimes string must be prepared and normalized before casting to number

    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
    

    usage:

    parseNumber('13,345')
    > 13345.0
    
    parseNumber('- 123 000')
    > -123000.0
    
    parseNumber('99999\n')
    > 99999.0
    

    and by the way, something to verify you have a number:

    import numbers
    def is_number(value):
        return isinstance(value, numbers.Number)
        # will work with int, float, long, Decimal
    
    0 讨论(0)
提交回复
热议问题