I need to convert a string in the format "1.234.345,00"
to the float
value 1234345.00
.
One way is to use repeated str.replace
:
x = "1.234.345,00"
res = float(x.replace('.', '').replace(',', '.'))
print(res, type(res))
1234345.0 <class 'float'>
However, this appears manual and non-generalised. This heavily upvoted answer suggests using the locale
library. But my default locale doesn't have the same conventions as my input string. I then discovered a way to extract the characters used in local conventions as a dictionary:
import locale
print(locale.localeconv())
{'int_curr_symbol': '', 'currency_symbol': '', 'mon_decimal_point': '',
..., 'decimal_point': '.', 'thousands_sep': '', 'grouping': []}
Is there a way to update this dictionary, save as a custom locale and then be able to call this custom locale going forwards. Something like:
mylocale = locale.create_new_locale() # "blank" conventions or copied from default
mylocale.localeconv()['thousands_sep'] = '.'
mylocale.localeconv()['decimal_point'] = ','
setlocale(LC_NUMERIC, mylocale)
atof('123.456,78') # 123456.78
If this isn't possible, how do we get a list of all available locale and their conventions? Seems anti-pattern to "deduce" the correct configuration from the conventions (not to mention inefficient / manual), so I was hoping for a generic solution such as above pseudo-code.
Edit: Here's my attempt at finding all locales where thousands_sep == '.'
and decimal_point == ','
. In fact, more generally, to group locales by combinations of these parameters:
import locale
from collections import defaultdict
d = defaultdict(list)
for alias in locale.locale_alias:
locale.setlocale(locale.LC_ALL, alias)
env = locale.localeconv()
d[(env['thousands_sep'], env['decimal_point'])].append(alias)
Result:
---------------------------------------------------------------------------
Error Traceback (most recent call last)
<ipython-input-164-f8f6a6db7637> in <module>()
5
6 for alias in locale.locale_alias:
----> 7 locale.setlocale(locale.LC_ALL, alias)
8 env = locale.localeconv()
9 d[(env['thousands_sep'], env['decimal_point'])].append(alias)
C:\Program Files\Anaconda3\lib\locale.py in setlocale(category, locale)
596 # convert to string
597 locale = normalize(_build_localename(locale))
--> 598 return _setlocale(category, locale)
599
600 def resetlocale(category=LC_ALL):
Error: unsupported locale setting
Converting Integers to FloatsPython's method float() will convert integers to floats. To use this function, add an integer inside of the parentheses: Info: To follow along with the example code in this tutorial, open a Python interactive shell on your local system by running the python3 command.
Integers and floating-point numbers can be mixed in arithmetic. Python 3 automatically converts integers to floats as needed.
We can convert a string to float in Python using the float() function. This is a built-in function used to convert an object to a floating point number. Internally, the float() function calls specified object __float__() function.
If you pop open the source code for locale, you can see that there is a variable called _override_localeconv
(which seems to be for testing purposes).
# With this dict, you can override some items of localeconv's return value.
# This is useful for testing purposes.
_override_localeconv = {}
Trying the following does seem to override the dictionary without changing the entire locale, though it probably has some unintended consequences, especially since changing locales isn't threadsafe. Be careful!
import locale
locale._override_localeconv["thousands_sep"] = "."
locale._override_localeconv["decimal_point"] = ","
print locale.atof('123.456,78')
Try it online!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With