JuliusMoehring
JuliusMoehring

Reputation: 91

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?

Upvotes: 3

Views: 1356

Answers (4)

Nadavo
Nadavo

Reputation: 250

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

Upvotes: 3

CircuitSacul
CircuitSacul

Reputation: 1830

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

Upvotes: 0

Jan
Jan

Reputation: 43169

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'>

Upvotes: 0

KUSHAGRA BANSAL
KUSHAGRA BANSAL

Reputation: 95

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

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

Upvotes: 0

Related Questions