Преобразование запятой в числовой формат Python

Раздел: Типы данных -> Преобразование типов данных

Преобразование строки с запятой в число в Python

В Python функции int и float принимают точку как десятичный разделитель. Если в тексте находится запятая, прямое преобразование вызывает ошибку. Выбор способа зависит от роли запятой: она может быть десятичным разделителем или разделителем тысяч.

Как быстро получить число из строки, где запятая отделяет дробную часть?

Для строки вида 123,45 запятая заменяется на точку, после чего применяется float. Для финансовых расчетов лучше сразу использовать Decimal.

text = '123,45'
number = float(text.replace(',', '.'))
print(number)

функция float в python (функция float в python)

123.45

Python строку в число с запятой (преобразование строки с запятой в число в python)

Шаги: 1) text.replace(',', '.') создает строку '123.45'; 2) float преобразует ее в число 123.45. Этот способ не подходит, если запятая разделяет тысячи, например в '1,234'.

from decimal import Decimal
text = '123,45'
number = Decimal(text.replace(',', '.'))
print(number)
123.45

Как удалить запятые как разделители тысяч и получить целое число?

Когда запятая разделяет группы цифр, ее удаляют до int. Пример: '1,234,567'.

text = '1,234,567'
number = int(text.replace(',', ''))
print(number)
1234567

Для числа с дробной точкой и разделителями тысяч сначала удаляют запятые: '1,234.56' становится '1234.56'.

text = '1,234.56'
number = float(text.replace(',', ''))
print(number)
1234.56

Как обработать европейский формат, где точка разделяет тысячи, а запятая является десятичной?

В формате '1.234.567,89' точки удаляются, запятая заменяется на точку.

text = '1.234.567,89'
clean = text.replace('.', '').replace(',', '.')
number = float(clean)
print(number)
1234567.89

Порядок замен важен. Если сначала заменить запятую на точку, получится '1.234.567.89', и float выдаст ошибку.

Как учитывать пробелы, неразрывные пробелы и знаки валют?

Строки часто содержат пробелы, символ валюты, знак процента. Перед преобразованием такие символы удаляются.

text = ' $1 234,56 '
clean = text.strip().replace('$', '').replace(' ', '').replace(',', '.')
number = float(clean)
print(number)
1234.56

Для неразрывного пробела можно добавить replace('\u00a0', '') или replace('\xa0', ''). В коде ниже используется escape-последовательность Python.

text = '1\u00a0234,56'
clean = text.replace('\u00a0', '').replace(',', '.')
number = float(clean)
print(number)
1234.56

Как применить locale.atof для локализованных чисел?

Модуль locale умеет преобразовывать числа с учетом локали. Для русской локали десятичный разделитель обычно запятая.

import locale
locale.setlocale(locale.LC_NUMERIC, 'ru_RU.UTF-8')
number = locale.atof('123,45')
print(number)
123.45

Название локали зависит от операционной системы. В Windows может использоваться 'Russian_Russia.1251'. Ошибка locale.Error возникает, если локаль не установлена.

Как извлечь число из строки с лишним текстом?

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

import re
text = 'Цена: 1 234,56 руб.'
match = re.search(r'-?\d[\d\s.,]*', text)
raw = match.group(0).replace(' ', '').replace(',', '.')
number = float(raw)
print(number)
1234.56

Регулярное выражение не различает десятичную запятую и разделитель тысяч. Для сложных форматов лучше комбинировать проверки.

Как преобразовать список строк с запятыми в список чисел?

Для списка применяется функция или генератор.

items = ['1,5', '2,75', '3,0']
numbers = [float(item.replace(',', '.')) for item in items]
print(numbers)
[1.5, 2.75, 3.0]

Если формат с разделителями тысяч, замена отличается: items = ['1,234', '5,678']; numbers = [int(item.replace(',', '')) for item in items].

Как безопасно обрабатывать ошибки преобразования?

Проверка через try/except позволяет вернуть None или значение по умолчанию.

def parse_decimal_comma(value):
    try:
        return float(value.replace(',', '.'))
    except (ValueError, AttributeError):
        return None
print(parse_decimal_comma('12,5'))
print(parse_decimal_comma('abc'))
12.5
None

Для Decimal ошибка называется InvalidOperation. Ее также можно перехватывать.

Типичные ошибки и проблемы

  • ValueError: could not convert string to float: '1,23'. float не принимает запятую как десятичный разделитель. Решение: replace(',', '.') или locale.atof.
  • Неверное число при смешанных разделителях. '1,234' может означать 1234 или 1.234. Решение: определить формат по источнику данных.
  • InvalidOperation для Decimal. Decimal('1,23') вызывает ошибку. Решение: Decimal('1,23'.replace(',', '.')).
  • Проблемы с локалью. locale.setlocale может не найти локаль. Решение: проверять доступные локали или использовать явные замены.
  • Неразрывные пробелы и валютные символы. Они остаются в строке и мешают преобразованию. Решение: удалять все лишние символы до int, float или Decimal.
  • Пустая строка и None. int('') и float(None) вызывают ошибки. Решение: предварительная проверка значения.

Расширенные примеры: строки с запятой в числа Python

Ниже собраны примеры для разных форматов: десятичная запятая, разделители тысяч, валюты, проценты, отрицательные значения, pandas, babel и собственный парсер.

1. Десятичная запятая и float

Пример
raw = '42,75'
value = float(raw.replace(',', '.'))
print(value)
print(type(value))
42.75
<class 'float'>

Замена создает строку '42.75'. Функция float возвращает число с плавающей точкой.

2. Десятичная запятая и Decimal

Пример
from decimal import Decimal
raw = '0,1'
value = Decimal(raw.replace(',', '.'))
print(value)
print(value + Decimal('0.2'))
0.1
0.3

Decimal сохраняет десятичную точность. Это полезно для денег.

3. Разделитель тысяч и int

Пример
raw = '1,234,567'
value = int(raw.replace(',', ''))
print(value)
1234567

4. Разделитель тысяч и float

Пример
raw = '1,234,567.89'
value = float(raw.replace(',', ''))
print(value)
1234567.89

5. Европейский формат

Пример
raw = '1.234.567,89'
value = float(raw.replace('.', '').replace(',', '.'))
print(value)
1234567.89

6. Пробелы как разделители тысяч

Пример
raw = '1 234 567,89'
value = float(raw.replace(' ', '').replace(',', '.'))
print(value)
1234567.89

7. Неразрывный пробел

Пример
raw = '1\u00a0234,56'
value = float(raw.replace('\u00a0', '').replace(',', '.'))
print(value)
1234.56

8. Символ валюты

Пример
raw = '$1,234.56'
value = float(raw.replace('$', '').replace(',', ''))
print(value)
1234.56

9. Знак процента

Пример
raw = '12,5%'
value = float(raw.replace('%', '').replace(',', '.')) / 100
print(value)
0.125

10. Отрицательное число с запятой

Пример
raw = '-1.234,56'
value = float(raw.replace('.', '').replace(',', '.'))
print(value)
-1234.56

11. Бухгалтерский формат со скобками

Пример
raw = '(1,234.56)'
sign = -1 if raw.startswith('(') and raw.endswith(')') else 1
clean = raw.strip('()').replace(',', '')
value = sign * float(clean)
print(value)
-1234.56

12. Экспоненциальная запись с запятой

Пример
raw = '1,23e3'
value = float(raw.replace(',', '.'))
print(value)
1230.0

13. Список строк

Пример
raw_list = ['1,5', '2,25', '3,75']
numbers = [float(item.replace(',', '.')) for item in raw_list]
print(numbers)
print(sum(numbers))
[1.5, 2.25, 3.75]
7.5

14. Словарь с числами

Пример
data = {'a': '1,5', 'b': '2,25'}
converted = {key: float(value.replace(',', '.')) for key, value in data.items()}
print(converted)
{'a': 1.5, 'b': 2.25}

15. locale.atof

Пример
import locale
locale.setlocale(locale.LC_NUMERIC, 'ru_RU.UTF-8')
print(locale.atof('1 234,56'))
1234.56

В некоторых системах локаль называется иначе. Если локаль не найдена, приходит locale.Error.

16. babel.numbers.parse_decimal

Пример
from babel.numbers import parse_decimal
value = parse_decimal('1.234,56', locale='ru_RU')
print(value)
print(type(value))
1234.56
<class 'decimal.Decimal'>

Библиотека Babel учитывает локальные правила группировки и десятичного разделителя.

17. pandas: decimal и thousands

Пример
import pandas as pd
from io import StringIO
csv = StringIO('''value
1,234.56
2,345.67
''')
df = pd.read_csv(csv, thousands=',')
print(df)
print(df['value'].dtype)
      value
0   1234.56
1   2345.67
float64

18. pandas с десятичной запятой

Пример
import pandas as pd
from io import StringIO
csv = StringIO('''value
1234,56
2345,67
''')
df = pd.read_csv(csv, decimal=',')
print(df)
print(df['value'].dtype)
     value
0  1234.56
1  2345.67
float64

19. Универсальный парсер

Пример
def parse_number(raw):
    if raw is None:
        return None
    text = str(raw).strip()
    if text == '':
        return None
    negative = text.startswith('-')
    text = text.replace(' ', '').replace('\u00a0', '')
    if text.startswith('(') and text.endswith(')'):
        negative = True
        text = text[1:-1]
    text = text.replace('$', '').replace('€', '').replace('%', '')
    comma_count = text.count(',')
    dot_count = text.count('.')
    if comma_count == 1 and dot_count == 0:
        text = text.replace(',', '.')
    elif comma_count > 0 and dot_count > 0:
        if text.rfind(',') > text.rfind('.'):
            text = text.replace('.', '').replace(',', '.')
        else:
            text = text.replace(',', '')
    elif comma_count > 1:
        text = text.replace(',', '')
    try:
        return float(text)
    except ValueError:
        return None
print(parse_number('1.234,56'))
print(parse_number('1,234.56'))
print(parse_number('1 234,56'))
print(parse_number('(1,234.56)'))
1234.56
1234.56
1234.56
-1234.56

20. Ошибка при неверном порядке замен

Пример
raw = '1.234,56'
try:
    value = float(raw.replace(',', '.').replace('.', ''))
except ValueError as error:
    print(error)
could not convert string to float: '123456'

В примере сначала запятая стала точкой, затем все точки удалились. В результате получилось 123456 вместо 1234.56.

Преобразование строки с запятой в число в Python - comments

En
Python строку в число с запятой (python)