'Convert a number using atof

In Python 3.5, I'd like to convert a German number string to a float using locale.atof with the following code:


import locale
from locale import atof
locale.setlocale(locale.LC_ALL, 'de_DE')

number = atof('17.907,08')

However, this raises a ValueError:

ValueError: could not convert string to float: '17.907.08'


Why? Isn't this exactly what atof() was made for?


Solution 1:[1]

Just for future reference - this is what I ended up using:

import locale
from locale import atof

def convert(string, thousands_delim = '.', abbr = 'de_DE.UTF-8'):
    ''' Converts a string to float '''

    locale.setlocale(locale.LC_ALL, abbr)
    try:
        number = atof("".join(string.split(thousands_delim)))
    except ValueError:
        number = None

    return number


You call it like
number = convert('17.907,08')
print(number)
# 17907.08

... or for English numbers:

number = convert('1,000,000', abbr = 'en_US')
print(number)
# 1000000.0

Solution 2:[2]

In Python 3.10 the works as expected

>>> from locale import atof
>>> import locale
>>> locale.setlocale( locale.LC_ALL, 'de_DE' )
'de_DE'
>>> atof('17.907,08')
17907.08

Using string manipulations to parse decimals is very fragile and should be avoided when possible. Using the wrong replacement could convert decimals to thousands and vice versa

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 Jan
Solution 2 Panagiotis Kanavos