'Convert string to int, float or leave it as string, depending on the best option

I'm trying to handle a dataset containing only str, but the values of the str can be either real text or something like "1.0" and "3.54".

I want to convert all string to the best possible type, which means 1.0 should be converted to int, 3.54 should be converted to float and everything else should stay str.

What is the best way to do so?



Solution 1:[1]

lets try

def convert(txt):
try:
    k = float(txt)
    if k%1 ==0:
        return int(k)
    return k

except ValueError:
    return txt

now what I'm thinking is, the input is either a number or not, anyway we can float it. if it is also divisable by 1 its an int and we're done. if it isn't then it is a float after all and we're done. any other case: there's nothing that we can do, and then let's return it

Solution 2:[2]

You can use a try except block to perform the operation.

for s in string:
    try:
        //convert to int or float
    except:
        pass

Solution 3:[3]

You may use

strings = ["some weird junk", "1.0", "2.345", -1000]

for string in strings:
    try:
        number, decimal = string.split(".")
        try:
            if decimal == "0":
                value = int(number)
            else:
                value = float(string)
        except:
            value = string
    except (ValueError, AttributeError):
        try:
            value = int(string)
        except ValueError:
            value = string

    print(value, type(value))

Which yields

some weird junk <class 'str'>
1 <class 'int'>
2.345 <class 'float'>
-1000 <class 'int'>

Solution 4:[4]

def convert(string):
    possible = [str, int, float]
    for func in possible:
        try:
            result = func(string)
        except ValueError:
            continue
        if str(result) == string and type(result) is not str:
            return result
    return string

strings = ['hello', '1', '1.0', '1.9']
for string in strings:
   result = convert(string)
   print(type(result), result)
Output:
<class 'str'> hello
<class 'int'> 1
<class 'float'> 1.0
<class 'float'> 1.9

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 KUSHAGRA BANSAL
Solution 3 Jan
Solution 4 CircuitSacul