Как конвертировать строку валюты евро в число с плавающей точкой?
Мне нужно преобразовать строковую валютную строку в формате континентальной Европы в число с плавающей точкой:
Входные данные:
'6.150.593,22 €'
Поймите, что десятичная точка - это запятая, а разделители тысяч - это символы периода.
Выход:
6150593.22
Я прочитал бы эти вопросы, но они работают только для валюты доллара США и локали:
- Как преобразовать строку валюты в число с плавающей запятой в Python?
- Python: как конвертировать валюту в десятичную?
currency_euros='6.150.593,22 €'
float(currency_euros[:-2])
Traceback (most recent call last):
File "", line 1, in
float(currency_euros[:-2])
ValueError: could not convert string to float: '6.150.593,22'
Обновлено: после ответа @IrmendeJong:
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, "es")
'es'
>>> print(locale.currency(6150593.22))
6150593,22 €
>>> money = '6.150.593,22 €'
>>> locale.atof(money)
Traceback (most recent call last):
File "<pyshell#68>", line 1, in <module>
locale.atof(money)
File "C:\Python35\lib\locale.py", line 318, in atof
return func(delocalize(string))
ValueError: could not convert string to float: '6150593.22 €'
>>>
Я в восторге от того, что locale.currency()
работает нормально, но ответный метод locale.atof()
не работает
5 ответов
Использование locale.atof
https://docs.python.org/3/library/locale.html
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC,"nl")
'nl'
>>> locale.atof("6.150.593,22")
6150593.22
Хороший способ сделать это (1 строка):
NewValue = float(value[:-2].replace(".", "").replace(",","."))
Простое решение может быть следующим:
>>> val = '6.150.593,22 €'
>>> res = val[:-2].split(',')
>>> float('.'.join([res[0].replace('.', ''), res[1]]))
6150593.22
value = '6.150.593,22 €'
value = value.split()[0] #Take out euro symbol
integer, decimal = value.split(',') #Separate integer and decimals
integer = integer.replace('.','') #Take out dots
final_value = int(integer) + (int(decimal) * (10**(-len(decimal))))
>>> import decimal, locale, re
>>> locale.setlocale(locale.LC_MONETARY, 'es_ES.UTF8')
>>> locale.setlocale(locale.LC_NUMERIC, 'es_ES.UTF8')
>>> locale.currency(6150593.22)
'6150593,22 €'
>>> re.sub('[^(\d,.)]', '', locale.currency(6150593.22))
'6150593,22'
>>> 6150593.22 == locale.atof(re.sub('[^(\d,.)]', '', locale.currency(6150593.22)))
True
>>> decimal.Decimal(locale.atof(re.sub('[^(\d,.)]', '', locale.currency(6150593.22))))
Decimal('6150593.219999999739229679107666015625')
Работает как «вернуть то, что currency() сделал с моим поплавком» для многих локалей, которые я тестировал.
Бонус: преобразование в десятичное число