Как преобразовать строку в плавучую или интру в Python

Jinku Hu 30 Январь 2023 18 Апрель 2020
  1. float() для преобразования строки в float на Python
  2. int() преобразует строку в int на Python
  3. ast.literal_eval для преобразования строки в float или int на Python
  4. Локализация и запятые при преобразовании строки в float на Python
  5. Сравнение выполнения различных методов преобразования строки в float или int на Python
Как преобразовать строку в плавучую или интру в Python

В этой обучающей статье мы расскажем, как конвертировать строку в float или int на Python.

float() для преобразования строки в float на Python

float() преобразует строку в число float, если это возможно.

>>> float('111.2222')
111.2222
>>> float('111.0')
111.0
>>> float('111')
111.0

int() преобразует строку в int на Python

int() может преобразовать строку в целое число, если данная строка является представлением целого числа. В противном случае это приведет к ошибке ValueError.

>>> int('111')
111
>>> int('111.0')
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    int('111.0')
ValueError: invalid literal for int() with base 10: '111.0'
>>> int('111.22222')
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    int('111.22222')
ValueError: invalid literal for int() with base 10: '111.22222'

Можно сначала преобразовать строку в float, а затем привести ее к int, если заданная строка является представлением числа с плавающей точкой.

>>> int(float('111.0'))
111

ast.literal_eval для преобразования строки в float или int на Python

ast.literal_eval(string)безопасно оценить данную строку, содержащую выражение на языке Python. Это может автоматически преобразовать строку в float или int.

>>> ast.literal_eval('111.2222')
111.2222
>>> ast.literal_eval('111.0')
111.0
>>> ast.literal_eval('111')
111

Локализация и запятые при преобразовании строки в float на Python

Если в строковом представлении существует запятая ,, то при преобразовании float будет выброшено исключение ValueError. Но запятые регулярно используются либо как тысячный разделитель в таких странах, как США или Великобритания, например, 111,111.22, либо как десятичная метка в большинстве европейских стран, например, 111,222.

>>> float('111,111.22')
Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    float('111,111.22')
ValueError: could not convert string to float: '111,111.22'
>>> float('111,111')
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    float('111,111')
ValueError: could not convert string to float: '111,111'

Модуль locale должен использоваться для присвоения информации о локали, а затем функция locale.atof() может разобрать данную строку как плавающую в соответствии с настройками локали.

Комментарии как тысяча разделителей в США или Великобритании

>>> import locale
>>> A = '111,111.222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(A)
111111.222
>>> locale.atof('111,111')
111111.0

Запятая , может быть правильно интерпретирована, если задана правильная настройка локали.

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

Запятые как демический знак в европейских странах

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'nl_NL')
'nl_NL'
>>> locale.atof('111,222')
111.222
>>> locale.atof('111.111,222')
111111.222

111,222 конвертируется в 111.222 правильно, и 111.111,222 также может быть конвертирован правильно в 111111.222, так как точка . используется в качестве тысячи сепаратор в европейских странах, таких как Нидерланды.

Сравнение выполнения различных методов преобразования строки в float или int на Python

Мы используем таймит для проверки эффективности различных методов.

>>> import timeint
>>> timeit.timeit('float(111.2222)', number=1000000)
0.14707240000007005
>>> timeit.timeit('ast.literal_eval("111.2222")', setup='import ast', number=1000000)
4.779956100000163
>>> timeit.timeit('locale.atof("111.2222")', setup='import locale; locale.setlocale(locale.LC_ALL, "en_US.UTF-8")', number=1000000)
6.092166299999917

Метод ast.literal_eval() значительно медленнее, чем метод float, как показано выше. Он не должен быть первым выбором, если вам просто нужно преобразовать строку в float или int на Python. Метод ast.literal_eval() перепроектирован в этом приложении, так как его основной целью должно быть вычисление строки, содержащей выражение на языке Python.

locale.atof() также чрезвычайно медленное, поэтому его следует использовать только тогда, когда в строке для конвенции существуют запятые в США или Великобритании, или точка . означает тысячу разделителей, а запятая , означает десятичную метку в европейских странах. Другими словами, если это действительно необходимо, следует использовать locale.atof().

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

Сопутствующая статья - Python String