2738

How can I convert an str to a float?

"545.2222" -> 545.2222

Or an str to a int?

"31" -> 31

For the reverse, see Convert integer to string in Python and Converting a float to a string without rounding it.

Please instead use How can I read inputs as numbers? to close duplicate questions where OP received a string from user input and immediately wants to convert it, or was hoping for input (in 3.x) to convert the type automatically.

2
  • 20
    As a general rule, if you have an object in Python, and want to convert to that type of object, call type(my_object) on it. The result can usually be called as a function to do the conversion. For instance type(100) results in int, so you can call int(my_object) to try convert my_object to an integer. This doesn't always work, but is a good "first guess" when coding. Commented Jul 5, 2018 at 1:18
  • Also make sure the string is actually can be converted to float, one way of doing that is to write a custom function with a try/except block, that checks for return float(str_value) inside try scope. Commented Aug 6, 2023 at 23:20

34 Answers 34

3082
>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545
8
  • 12
    just wondering why there is '04' in the end? why not simply '00'? also my current version of python is not having '04'. Commented Aug 17, 2017 at 15:25
  • 77
    @MangatRaiModi Floating point numbers are inherently imperfect for representing decimals. For more, see stackoverflow.com/q/21895756/931277
    – dokkaebi
    Commented Aug 18, 2017 at 21:44
  • 28
    why not simply int(a) but int(float(a)) ? Commented Apr 26, 2018 at 14:36
  • 43
    int(a) will give an error that the string isn't a valid integer: ValueError: invalid literal for int() with base 10: '545.222', but converting from a float to an int is a supported conversion. Commented May 7, 2018 at 17:46
  • 5
    You should handle ValueError if you want to be safe
    – Joe Bobson
    Commented Sep 9, 2018 at 13:20
602

Python2 method to check if a string is a float:

def is_float(value):
  if value is None:
      return False
  try:
      float(value)
      return True
  except:
      return False

For the Python3 version of is_float see: Checking if a string can be converted to float in Python

A longer and more accurate name for this function could be: is_convertible_to_float(value)

What is, and is not a float in Python may surprise you:

The below unit tests were done using python2. Check it that Python3 has different behavior for what strings are convertable to float. One confounding difference is that any number of interior underscores are now allowed: (float("1_3.4") == float(13.4)) is True

val                   is_float(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1_2_3.4"             False        Underscores not allowed
"12 34"               False        Spaces not allowed on interior
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

You think you know what numbers are? You are not so good as you think! Not big surprise.

Don't use this code on life-critical software!

Catching broad exceptions this way, killing canaries and gobbling the exception creates a tiny chance that a valid float as string will return false. The float(...) line of code can failed for any of a thousand reasons that have nothing to do with the contents of the string. But if you're writing life-critical software in a duck-typing prototype language like Python, then you've got much larger problems.

9
  • 1
    So true becomes 1, that is I inherited from C++ i think Commented Sep 11, 2018 at 6:07
  • 9
    I posted this answer in 2014. That UTF-8 glyph for a Chinese 4 has been transforming over the years depending on how stackoverflow developers change up their character encoding scheme upon their microsoft toolstack. It's a curiosity to see it flip flop over the years as new conversion schemes assert their new ideologies. But yes, Any UTF-8 glyph for a Eastern oriental numeric is not a Python float. Bazinga. Commented Dec 4, 2018 at 18:48
  • 9
    how can this be so upvoted, with such a broad exception?
    – E.Serra
    Commented Mar 13, 2019 at 11:38
  • Everything with spaces in between cannot be converted, like "- 12.3" and "45 e6"
    – Simon
    Commented Aug 12, 2019 at 13:43
  • 12
    This except clause should be restricted to TypeError, ValueError
    – wim
    Commented Aug 31, 2019 at 18:11
580
def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)
6
  • 90
    implicit mixing floats/ints might lead to subtle bugs due to possible loss of precision when working with floats or to different results for / operator on floats/ints. Depending on context it might be preferable to return either int or float, not both.
    – jfs
    Commented Nov 16, 2012 at 14:35
  • 15
    @J.F.Sebastian You are completely correct, but there are times when you want the input to dictate which one it will be. Letting the input dictate which one can work nicely with duck-typing. Commented Mar 5, 2013 at 21:29
  • 9
    You can nest another try to throw an exception when it's not convertible to float.
    – iBug
    Commented Jan 25, 2018 at 12:31
  • 2
    Fails with s = u'\u0000' Commented Nov 12, 2018 at 1:26
  • 1
    @iBug Good idea! I recommend throwing ValueError in the corresponding except :P
    – marcelm
    Commented Feb 5, 2019 at 22:43
167

Another method which deserves to be mentioned here is ast.literal_eval:

This can be used for safely evaluating strings containing Python expressions from untrusted sources without the need to parse the values oneself.

That is, a safe 'eval'

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31
4
  • 16
    this is not a good solution to the problem. It works fine in Python 2, but the following happens in Python 3: python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>> To clarify why this is a problem, if you want it to leave phone numbers alone and not assume they are mathematical expressions, then this approach is not for you.
    – royce3
    Commented Jan 16, 2018 at 16:14
  • 6
    @royce3 Yeah, that's a good point and users should beware. The behaviour was originally modified in order to address some issues with parsing of complex literals. It's arguably a bug in ast.literal_eval, and has been discussed here.
    – wim
    Commented Jan 16, 2018 at 17:57
  • 5
    @royce3 For the record, ast will not literal eval that phone number to -2566 anymore in Python 3. It's in the Python 3.7 changelog: ast.literal_eval() is now stricter. Addition and subtraction of arbitrary numbers are no longer allowed. (Contributed by Serhiy Storchaka in bpo-31778)
    – wim
    Commented Apr 26, 2022 at 15:55
  • Caution: ast.literal_eval does not seem to work for numeric inputs (raising ValueError: malformed node or string: 0).
    – mirekphd
    Commented Dec 14, 2022 at 18:51
89

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.

4
  • This seems like an ideal solution when you know if a float or int should be returned, but how can you get this to return an int only if an int was passed? For example, x = '1'; locale.atof(x) returns 1.0 when I actually want 1. Commented Jan 2, 2019 at 18:33
  • 1
    Using Dino's method, I guess the answer would be to use something like this: locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x) Commented Jan 2, 2019 at 18:52
  • I would recommend using Javier's method above (wrapping locale.atoi in a try and using locale.atof on exception -- it's probably more readable. Commented Jan 2, 2019 at 19:08
  • Caution: locale.atof(my_int) will change type from int to float...
    – mirekphd
    Commented Dec 14, 2022 at 18:54
83
float(x) if '.' in x else int(x)
6
  • 63
    Nitpick: doesn't work for extreme cases like float("2e-3")
    – Emile
    Commented Dec 8, 2010 at 14:22
  • 27
    Note : be careful when dealing with money amount passed as strings, as some countries use "," as decimal separators
    – Ben G
    Commented Jul 8, 2011 at 11:17
  • 140
    @Emile: I wouldn't call "2e-3" an "extreme case". This answer is just broken.
    – jchl
    Commented Sep 7, 2011 at 10:05
  • 16
    @BenG DON'T manipulate money as a float. That's asking for trouble. Use decimal for money! (But your comment about ',' is still valid and important) Commented Dec 13, 2013 at 6:10
  • 8
    Easily breakable by an IP address - 192.168.0.1; or "This is not a good approach. :)" Commented Jan 13, 2019 at 19:47
36

If you aren't averse to third-party modules, you could check out the fastnumbers module. It provides a function called fast_real that does exactly what this question is asking for and does it faster than a pure-Python implementation:

>>> from fastnumbers import fast_real
>>> fast_real("545.2222")
545.2222
>>> type(fast_real("545.2222"))
float
>>> fast_real("31")
31
>>> type(fast_real("31"))
int
0
28

In Python, how can I parse a numeric string like "545.2222" to its corresponding float value, 542.2222? Or parse the string "31" to an integer, 31? I just want to know how to parse a float string to a float, and (separately) an int string to an int.

It's good that you ask to do these separately. If you're mixing them, you may be setting yourself up for problems later. The simple answer is:

"545.2222" to float:

>>> float("545.2222")
545.2222

"31" to an integer:

>>> int("31")
31

Other conversions, ints to and from strings and literals:

Conversions from various bases, and you should know the base in advance (10 is the default). Note you can prefix them with what Python expects for its literals (see below) or remove the prefix:

>>> int("0b11111", 2)
31
>>> int("11111", 2)
31
>>> int('0o37', 8)
31
>>> int('37', 8)
31
>>> int('0x1f', 16)
31
>>> int('1f', 16)
31

If you don't know the base in advance, but you do know they will have the correct prefix, Python can infer this for you if you pass 0 as the base:

>>> int("0b11111", 0)
31
>>> int('0o37', 0)
31
>>> int('0x1f', 0)
31

Non-Decimal (i.e. Integer) Literals from other Bases

If your motivation is to have your own code clearly represent hard-coded specific values, however, you may not need to convert from the bases - you can let Python do it for you automatically with the correct syntax.

You can use the apropos prefixes to get automatic conversion to integers with the following literals. These are valid for Python 2 and 3:

Binary, prefix 0b

>>> 0b11111
31

Octal, prefix 0o

>>> 0o37
31

Hexadecimal, prefix 0x

>>> 0x1f
31

This can be useful when describing binary flags, file permissions in code, or hex values for colors - for example, note no quotes:

>>> 0b10101 # binary flags
21
>>> 0o755 # read, write, execute perms for owner, read & ex for group & others
493
>>> 0xffffff # the color, white, max values for red, green, and blue
16777215

Making ambiguous Python 2 octals compatible with Python 3

If you see an integer that starts with a 0, in Python 2, this is (deprecated) octal syntax.

>>> 037
31

It is bad because it looks like the value should be 37. So in Python 3, it now raises a SyntaxError:

>>> 037
  File "<stdin>", line 1
    037
      ^
SyntaxError: invalid token

Convert your Python 2 octals to octals that work in both 2 and 3 with the 0o prefix:

>>> 0o37
31
0
27

Users codelogic and harley are correct, but keep in mind if you know the string is an integer (for example, 545) you can call int("545") without first casting to float.

If your strings are in a list, you could use the map function as well.

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

It is only good if they're all the same type.

0
22

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'
2
  • 12
    1e3 is a number in python, but a string according to your code. Commented Oct 4, 2012 at 13:24
  • I prefer this answer.
    – enchance
    Commented Jul 17, 2020 at 10:04
19

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

1
  • 1
    This will give you a float object if your string happens to be "0" or "0.0", rather than the int it gives for other valid numbers.
    – Brian
    Commented Dec 19, 2008 at 8:42
19

The YAML parser can help you figure out what datatype your string is. Use yaml.load(), and then you can use type(result) to test for type:

>>> 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'>
2
  • This is a great answer (or json or whatever your favorite is): we all recognize that proper conversion is non-trivial. So find a widely adopted library that manages this for you. :) Commented Sep 10, 2021 at 9:00
  • JSON can work great but will just raise a TypeError if a string is passed, so needs some custom handling or pre-checks to avoid some attempts. Like I some regexp: stackoverflow.com/a/69790897/1236083
    – Rafe
    Commented Oct 31, 2021 at 21:57
15

I use this function for that

import ast

def parse_str(s):
   try:
      return ast.literal_eval(str(s))
   except:
      return

It will convert the string to its type

value = parse_str('1')  # Returns Integer
value = parse_str('1.5')  # Returns Float
1
  • 2
    Please be noted that parse_str(' 1') (with a space) will return None, not 1.
    – musiphil
    Commented May 2, 2019 at 19:37
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
3
  • 1
    Why would you raise in your except section if you are doing nothing there? float() would raise for you.
    – Greg0ry
    Commented Mar 19, 2016 at 20:30
  • 1
    you are right I guess I copied and paste from a functionality that I was raising a particular exception. will edit. thanks
    – Totoro
    Commented Nov 2, 2016 at 15:18
  • 1
    This will try to parse a string and return either int or float depending on what the string represents. It might rise parsing exceptions or [have some unexpected behaviour][1].
    – Kuzeko
    Commented May 18, 2017 at 7:28
11

You could use json.loads:

>>> import json
>>> json.loads('123.456')
123.456
>>> type(_)
<class 'float'>
>>> 

As you can see it becomes a type of float.

0
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

You need to take into account rounding to do this properly.

i.e. - int(5.1) => 5 int(5.6) => 5 -- wrong, should be 6 so we do int(5.6 + 0.5) => 6

def convert(n):
    try:
        return int(n)
    except ValueError:
        return float(n + 0.5)
3
  • 4
    Good point. That causes inflation, though, so Python 3 and other modern languages use banker's rounding. Commented Oct 4, 2012 at 12:58
  • 2
    This answer is wrong (as originally written). It muddles the two cases of int and float. And it will give an exception, when n is a string, as OP desired. Maybe you meant: When an int result is desired, round should be done AFTER conversion to float. If the function should ALWAYS return an int, then you don't need the except part -- the entire function body can be int(round(float(input))). If the function should return an int if possible, otherwise a float, then javier's original solution is correct! Commented Dec 13, 2013 at 6:02
  • ValueError: could not convert string to float
    – Avi Thour
    Commented May 1, 2022 at 23:04
7

There is also regex, because sometimes string must be prepared and normalized before casting to a 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
6

To typecast in Python use the constructor functions of the type, passing the string (or whatever value you are trying to cast) as a parameter.

For example:

>>>float("23.333")
   23.333

Behind the scenes, Python is calling the objects __float__ method, which should return a float representation of the parameter. This is especially powerful, as you can define your own types (using classes) with a __float__ method so that it can be casted into a float using float(myobject).

6

Handles hex, octal, binary, decimal, and float

This solution will handle all of the string conventions for numbers (all that I know about).

def to_number(n):
    ''' Convert any number representation to a number
    This covers: float, decimal, hex, and octal numbers.
    '''

    try:
        return int(str(n), 0)
    except:
        try:
            # Python 3 doesn't accept "010" as a valid octal.  You must use the
            # '0o' prefix
            return int('0o' + n, 0)
        except:
            return float(n)

This test case output illustrates what I'm talking about.

======================== CAPTURED OUTPUT =========================
to_number(3735928559)   = 3735928559 == 3735928559
to_number("0xFEEDFACE") = 4277009102 == 4277009102
to_number("0x0")        =          0 ==          0
to_number(100)          =        100 ==        100
to_number("42")         =         42 ==         42
to_number(8)            =          8 ==          8
to_number("0o20")       =         16 ==         16
to_number("020")        =         16 ==         16
to_number(3.14)         =       3.14 ==       3.14
to_number("2.72")       =       2.72 ==       2.72
to_number("1e3")        =     1000.0 ==       1000
to_number(0.001)        =      0.001 ==      0.001
to_number("0xA")        =         10 ==         10
to_number("012")        =         10 ==         10
to_number("0o12")       =         10 ==         10
to_number("0b01010")    =         10 ==         10
to_number("10")         =         10 ==         10
to_number("10.0")       =       10.0 ==         10
to_number("1e1")        =       10.0 ==         10

Here is the test:

class test_to_number(unittest.TestCase):

    def test_hex(self):
        # All of the following should be converted to an integer
        #
        values = [

                 #          HEX
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (0xDEADBEEF  , 3735928559), # Hex
                ("0xFEEDFACE", 4277009102), # Hex
                ("0x0"       ,          0), # Hex

                 #        Decimals
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (100         ,        100), # Decimal
                ("42"        ,         42), # Decimal
            ]



        values += [
                 #        Octals
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (0o10        ,          8), # Octal
                ("0o20"      ,         16), # Octal
                ("020"       ,         16), # Octal
            ]


        values += [
                 #        Floats
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                (3.14        ,       3.14), # Float
                ("2.72"      ,       2.72), # Float
                ("1e3"       ,       1000), # Float
                (1e-3        ,      0.001), # Float
            ]

        values += [
                 #        All ints
                 # ----------------------
                 # Input     |   Expected
                 # ----------------------
                ("0xA"       ,         10),
                ("012"       ,         10),
                ("0o12"      ,         10),
                ("0b01010"   ,         10),
                ("10"        ,         10),
                ("10.0"      ,         10),
                ("1e1"       ,         10),
            ]

        for _input, expected in values:
            value = to_number(_input)

            if isinstance(_input, str):
                cmd = 'to_number("{}")'.format(_input)
            else:
                cmd = 'to_number({})'.format(_input)

            print("{:23} = {:10} == {:10}".format(cmd, value, expected))
            self.assertEqual(value, expected)
1
  • ValueError: could not convert string to float
    – Avi Thour
    Commented May 1, 2022 at 23:06
6

Pass your string to this function:

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)

It will return int, float or string depending on what was passed.

String that is an int

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

String that is a float

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

String that is a string

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

String that looks like a float

print(type(string_to_number("hel.lo")))
<class 'str'>
2
  • 3
    when looking at the name string_to_number I wouldn't expect it to return a string. I would expect it to raise an Exception if the input can't be parsed
    – Neuron
    Commented Jul 29, 2021 at 12:26
  • 1
    I don't think it's a controversial opinion that a method called string_to_number should not return a string. I downvoted because the function is either poorly named or it's behaviour is wrong. also, there is no need to be passive aggressive. We can talk this out in a professional fashion
    – Neuron
    Commented Jul 30, 2021 at 8:56
4
a = int(float(a)) if int(float(a)) == float(a) else float(a)
0
3

This is a corrected version of Totoro's answer.

This will try to parse a string and return either int or float depending on what the string represents. It might rise parsing exceptions or have some unexpected behaviour.

  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
2

If you are dealing with mixed integers and floats and want a consistent way to deal with your mixed data, here is my solution with the proper docstring:

def parse_num(candidate):
    """Parse string to number if possible
    It work equally well with negative and positive numbers, integers and floats.

    Args:
        candidate (str): string to convert

    Returns:
        float | int | None: float or int if possible otherwise None
    """
    try:
        float_value = float(candidate)
    except ValueError:
        return None

    # Optional part if you prefer int to float when decimal part is 0
    if float_value.is_integer():
        return int(float_value)
    # end of the optional part

    return float_value

# Test
candidates = ['34.77', '-13', 'jh', '8990', '76_3234_54']
res_list = list(map(parse_num, candidates))
print('Before:')
print(candidates)
print('After:')
print(res_list)

Output:

Before:
['34.77', '-13', 'jh', '8990', '76_3234_54']

After:
[34.77, -13, None, 8990, 76323454]
1

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.

1
  • 1
    The generator stops after the first interpretation of float. The trycatch block should probably be inside the for loop.
    – musiphil
    Commented May 2, 2019 at 19:43
1

If you don't want to use third party modules the following might be the most robust solution:

def string_to_int_or_float(s):
    try:
        f = float(s) # replace s with str(s) if you are not sure that s is a string
    except ValueError:
        print("Provided string '" + s + "' is not interpretable as a literal number.")
        raise
    try:
        i = int(str(f).rstrip('0').rstrip('.'))
    except:
        return f
    return i

It might not be the fastest, but it handles correctly literal numbers where many other solutions fail, such as:

>>> string_to_int_or_float('789.')
789
>>> string_to_int_or_float('789.0')
789
>>> string_to_int_or_float('12.3e2')
1230
>>> string_to_int_or_float('12.3e-2')
0.123
>>> string_to_int_or_float('4560e-1')
456
>>> string_to_int_or_float('4560e-2')
45.6
0

This is a function which will convert any object (not just str) to int or float, based on if the actual string supplied looks like int or float. Further if it's an object which has both __float and __int__ methods, it defaults to using __float__

def conv_to_num(x, num_type='asis'):
    '''Converts an object to a number if possible.
    num_type: int, float, 'asis'
    Defaults to floating point in case of ambiguity.
    '''
    import numbers

    is_num, is_str, is_other = [False]*3

    if isinstance(x, numbers.Number):
        is_num = True
    elif isinstance(x, str):
        is_str = True

    is_other = not any([is_num, is_str])

    if is_num:
        res = x
    elif is_str:
        is_float, is_int, is_char = [False]*3
        try:
            res = float(x)
            if '.' in x:
                is_float = True
            else:
                is_int = True
        except ValueError:
            res = x
            is_char = True

    else:
        if num_type == 'asis':
            funcs = [int, float]
        else:
            funcs = [num_type]

        for func in funcs:
            try:
                res = func(x)
                break
            except TypeError:
                continue
        else:
            res = x
0

By using int and float methods we can convert a string to integer and floats.

s="45.8"
print(float(s))

y='67'
print(int(y))
1
  • 2
    This answer doesn't add anything new. See, for example, this answer which gives the same information and more.
    – Georgy
    Commented May 26, 2020 at 13:56
0

For numbers and characters together:

string_for_int = "498 results should get"
string_for_float = "498.45645765 results should get"

First import re:

 import re

 # For getting the integer part:
 print(int(re.search(r'\d+', string_for_int).group())) #498

 # For getting the float part:
 print(float(re.search(r'\d+\.\d+', string_for_float).group())) #498.45645765

For easy model:

value1 = "10"
value2 = "10.2"
print(int(value1)) # 10
print(float(value2)) # 10.2
0
0

You can simply do this by

s = '542.22'

f = float(s) # This converts string data to float data with a decimal point
print(f) 

i = int(f) # This converts string data to integer data by just taking the whole number part of it
print(i) 

For more information on parsing of data types check on python documentation!

Not the answer you're looking for? Browse other questions tagged or ask your own question.