Мне нужно преобразовать строку в формате "1.234.345,00"
в значение float
1234345.00
.
Один из способов - использовать повторное str.replace
:
x = "1.234.345,00"
res = float(x.replace('.', '').replace(',', '.'))
print(res, type(res))
1234345.0 <class 'float'>
Однако это выглядит ручным и не обобщенным. Это сильно upvoted ответ предлагает использовать locale
библиотеку. Но мой локаль по умолчанию не имеет тех же условностей, что и моя строка ввода. Затем я обнаружил способ извлечь символы, используемые в локальных соглашениях, в качестве словаря:
import locale
print(locale.localeconv())
{'int_curr_symbol': '', 'currency_symbol': '', 'mon_decimal_point': '',
..., 'decimal_point': '.', 'thousands_sep': '', 'grouping': []}
Есть ли способ обновить этот словарь, сохранить как пользовательский локаль, а затем иметь возможность вызвать этот пользовательский языковой стандарт. Что-то вроде:
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
Если это невозможно, как мы получим список всех доступных языковых стандартов и их условностей? Кажется, что анти-шаблон "выводит" правильную конфигурацию из соглашений (не говоря уже о неэффективности/ручной), поэтому я надеялся на универсальное решение, такое как выше псевдокод.
Edit: Здесь моя попытка найти все локали, где thousands_sep == '.'
и decimal_point == ','
. Фактически, в более общем плане, группировать локали по комбинациям этих параметров:
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)
Результат:
---------------------------------------------------------------------------
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