Вопрос-Ответ

How can I convert a string with dot and comma into a float in Python

Как я могу преобразовать строку с точкой и запятой в число с плавающей запятой в Python

Как я могу преобразовать строку типа 123,456.908 в float 123456.908 в Python?


Для intэтого см. Как преобразовать строку в число, если в ней есть запятые в качестве разделителей тысяч?, хотя методы по сути те же.

Переведено автоматически
Ответ 1

Использование служб локализации

Язык по умолчанию

Стандартная библиотека locale модуль представляет собой интерфейс Python к процедурам локализации на основе C.

Основное использование:

import locale
locale.atof('123,456')

В локализациях, где , обрабатывается как разделитель тысяч, это вернет 123456.0; в локализациях, где это обрабатывается как десятичная точка, это вернет 123.456.

Однако, по умолчанию это не сработает:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/locale.py", line 326, in atof
return func(delocalize(string))
ValueError: could not convert string to float: '123,456'

Это связано с тем, что по умолчанию программа находится "в языковом стандарте", который не имеет ничего общего с платформой, на которой выполняется код, но вместо этого определяется стандартом POSIX. Как объясняется в документации:


Изначально, при запуске программы, локаль является C локалем, независимо от того, какой локаль предпочитает пользователь. Есть одно исключение: LC_CTYPE категория изменяется при запуске, чтобы установить текущую кодировку локали на предпочтительную кодировку локали пользователя. Программа должна явно указать, что ей нужны предпочтительные настройки локали пользователя для других категорий, вызвав setlocale(LC_ALL, '').


То есть: помимо указания настройки системы по умолчанию для предпочтительной кодировки символов в текстовых файлах (в настоящее время это, вероятно, UTF-8), по умолчанию locale модуль будет интерпретировать данные так же, как это делает сам Python (через локаль, названную C в честь языка программирования C.). locale.atof будет делать то же самое, что float передается строка, и аналогично locale.atoi будет имитировать int.

Используя языковой стандарт из среды

Выполнение setlocale вызова, упомянутого в приведенной выше цитате из документации, вызовет настройки локали из среды пользователя. Таким образом:

>>> import locale
>>> # passing an empty string asks for a locale configured on the
>>> # local machine; the return value indicates what that locale is.
>>> locale.setlocale(locale.LC_ALL, '')
'en_CA.UTF-8'
>>> locale.atof('123,456.789')
123456.789
>>> locale.atof('123456.789')
123456.789

Локали не будет волновать, находятся ли разделители тысяч в нужном месте - она просто распознает и фильтрует их:

>>> locale.atof('12,34,56.789')
123456.789

В версии 3.6 и выше также не будут учитываться символы подчеркивания, которые отдельно обрабатываются встроенным float и int преобразованием:

>>> locale.atof('12_34_56.789')
123456.789

С другой стороны, метод string format и f-strings зависят от локали, если используется n формат:

>>> f'{123456.789:.9n}' # `.9` specifies 9 significant figures
'123,456.789'

Без предыдущего setlocale вызова в выходных данных не было бы запятой.

Явная настройка локали

Также возможно создать временные настройки локали, используя соответствующее название локали, и применить эти настройки только к определенному аспекту локализации. Чтобы получить локализованный синтаксический анализ и форматирование только для чисел, например, используйте LC_NUMERIC вместо LC_ALL в setlocale вызове.

Вот несколько примеров:

>>> # in Denmark, periods are thousands separators and commas are decimal points
>>> locale.setlocale(locale.LC_NUMERIC, 'en_DK.UTF-8')
'en_DK.UTF-8'
>>> locale.atof('123,456.789')
123.456789
>>> # Formatting a number according to the Indian lakh/crore system:
>>> locale.setlocale(locale.LC_NUMERIC, 'en_IN.UTF-8')
'en_IN.UTF-8'
>>> f'{123456.789:9.9n}'
'1,23,456.789'

Необходимые строки локали могут зависеть от вашей операционной системы, и для включения может потребоваться дополнительная работа.

Чтобы вернуться к тому, как Python ведет себя по умолчанию, используйте C язык, описанный ранее, таким образом: locale.setlocale(locale.LC_ALL, 'C').

Предостережения

Настройка локали влияет на поведение программы глобально и не является потокобезопасной. Если это вообще делается, обычно это следует выполнять только один раз в начале программы. Снова цитирую документацию.:


Обычно вызывать setlocale() в какой-либо библиотечной процедуре плохую идею, поскольку в качестве побочного эффекта это влияет на всю программу. Сохранять и восстанавливать ее почти так же плохо: это дорого и влияет на другие потоки, которые запускались до восстановления настроек.



Если при кодировании модуля для общего использования вам нужна независимая от локали версия операции, на которую влияет локаль (например, определенные форматы, используемые с time.strftime()), вам придется найти способ сделать это без использования стандартной библиотечной процедуры. Еще лучше убедить себя, что использование настроек локали допустимо. Только в качестве последнего средства вы должны документально подтвердить, что ваш модуль несовместим с настройками, отличными от C локали.


Когда код Python встроен в программу на C, настройка локали может повлиять даже на код на C:


Модули расширения никогда не должны вызывать setlocale(), кроме как для выяснения текущей локали. Но поскольку возвращаемое значение можно использовать переносимо только для его восстановления, это не очень полезно (за исключением, возможно, того, чтобы выяснить, соответствует ли локаль C).


(Примечание: когда setlocale вызывается с одним category аргументом или с None - не пустая строка - для имени локали, это ничего не меняет, а просто возвращает имя существующей локали.)

Итак, это не предназначено как инструмент в производственном коде для экспериментального анализа или форматирования данных, которые предназначались для разных локалей. Приведенные выше примеры являются лишь примерами, иллюстрирующими, как работает система. Для этой цели поищите стороннюю библиотеку интернационализации.

Однако, если все данные отформатированы в соответствии с определенной локализацией, предварительное указание этой локали позволит использовать locale.atoi и locale.atof в качестве замены для int и float вызовов при вводе строки.

Ответ 2

Просто удалите , с replace():

float("123,456.908".replace(',',''))
Ответ 3

Если вы не знаете языковой стандарт и хотите проанализировать любой тип числа, используйте эту parseNumber(text) функцию (My repo). Это не идеально, но учитывает большинство случаев :

>>> parseNumber("a 125,00 €")
125
>>> parseNumber("100.000,000")
100000
>>> parseNumber("100 000,000")
100000
>>> parseNumber("100,000,000")
100000000
>>> parseNumber("100 000 000")
100000000
>>> parseNumber("100.001 001")
100.001
>>> parseNumber("$.3")
0.3
>>> parseNumber(".003")
0.003
>>> parseNumber(".003 55")
0.003
>>> parseNumber("3 005")
3005
>>> parseNumber("1.190,00 €")
1190
>>> parseNumber("1190,00 €")
1190
>>> parseNumber("1,190.00 €")
1190
>>> parseNumber("$1190.00")
1190
>>> parseNumber("$1 190.99")
1190.99
>>> parseNumber("1 000 000.3")
1000000.3
>>> parseNumber("1 0002,1.2")
10002.1
>>> parseNumber("")

>>> parseNumber(None)

>>> parseNumber(1)
1
>>> parseNumber(1.1)
1.1
>>> parseNumber("rrr1,.2o")
1
>>> parseNumber("rrr ,.o")

>>> parseNumber("rrr1rrr")
1
Ответ 4

Если во входных данных используется запятая в качестве десятичной точки и точка в качестве разделителя тысяч, используйте .replace дважды, чтобы преобразовать данные в формат, используемый встроенной программой float. Таким образом:

s = s.replace('.','').replace(',','.')
number = float(s)
2023-06-07 19:55 python