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

Одна из наиболее распространенных вопросов, связанных со строками — из преобразование в число. Как преобразовать в python строку в число мы рассмотрим в этом посте. Также сможем проверить, является ли содержимое строки числом.

В стандартной библиотеке python есть великолепные функции преобразования. Но к сожалению они ограничены. Функция int() возвращает целое число, если получает на входе строку с целочисленным значением. Та же история с float() — число с плавающей точкой. Иначе обе эти функции возвращают ошибку TypeError…

Ниже приведен полный код программы, в которой 5 функций:

  1. Чистка строки: удаляет из строки все символы, доведя содержимое до целочисленного или числа с плавающей точкой.
  2. Функция преобразования строки в целочисленное. На входе должна быть строка с любым числовым содержимым: ‘123.4’ или ‘232’
  3. Функция проверки содержимого строки на «целочисленность».
  4. Функция преобразования строки в число с плавающей точкой. На входе должна быть строка с любым числовым содержимым: ‘123.4’ или ‘232’
  5. Проверяем, является ли содержимое строки числом с плавающей точкой.

Это, на мой взгляд, наиболее распространенные задачи, которые приходится решать в области преобразования строк в числа. Далее код программы:

# ~*~ coding: utf8 ~*~

def clear_string(str, to_int = None):
    '''
    Чистим строку от "мусора" - нечисловых символов.
    '''
    new_str = ''
    for s in str:
        # сначала ищем точку (вдруг число с плавающей точкой)
        # при этом в новой строке не должно быть больше одной точки
        # и в условии to_int не определен
        if s == '.' and '.' not in new_str and not to_int:
            new_str += s
        else:
            try:
                i = int(s)
                new_str += s
            except:
                pass
    return new_str

def str_to_int(str):
    '''
    Преобразование стоки в целое число
    '''
    # попробуем воспользоваться самым простым методом
    try:
        return int(str)
    except:
        # если не получилось, то проверяем почему? допускаем, что было передано не целое число в строке
        if '.' in str:
            str = str[0:str.find('.')]
            return str_to_int(str)
        else:
            # если уж совсем дела плохи, то возвращаем 0
            return 0

def check_int(str):
    try:
        int(str)
        return True
    except:
        return False

def str_to_float(str):
    '''
    Преобразование стоки в число с плавающей точкой
    '''
    # попробуем воспользоваться самым простым методом
    try:
        return float(str)
    except:
        # других вариантов не осталось. скорее всего функция приняла на входе мусор
        return 0

def check_float(str):
    try:
        float(str)
        return True
    except:
        return False

# есть у нас незатейливая строка
str = 'a23d.d.5ff6'
# проверяем функцию чистки строки
print('Чищеная строка: %s' % clear_string(str))
print('Чищеная строка с to_int: %s' % clear_string(str, to_int=True))
# до преобразования строки в число следовало бы почистить ее
print('Преобразуем мусор в целое число: %s' % str_to_int(str))
print('Преобразуем чищеную строку в целое число: %s' % str_to_int(clear_string(str)))
# преобразуем строку в число с плавающей точкой
print('Преобразуем мусор в число с плавающей точкой: %s' % str_to_float(str))
print('Преобразуем чищеную строку в число с плавающей точкой: %s' % str_to_float(clear_string(str)))

print('Проверяем, является ли содержимое строки целочисленным: %s' % check_int(str))
print('Проверяем, является ли содержимое чищеной строки целочисленным: %s' % check_int(clear_string(str, to_int=True)))
print('Проверяем, является ли содержимое строки числом с плавающей точкой: %s' % check_float(str))
print('Проверяем, является ли содержимое чищеной строки числом с плавающей точкой: %s' % check_float(clear_string(str)))

Задачу по проверке содержимого строки на целочисленность можно было бы решить с помощью стандартной функции isdigit(). Но это слишком просто. Для наглядности и создали функцию check_int(), которая работает так же, как и isdigit().

# Для успокоения души слишком любознательных приведу пример
's34'.isdigit()
# False
'34'.isdigit()
# True
clear_string('s43de463').isdigit()
# True

Ну и напоследок, если у вас есть комментарии или более интересные задачи из выше рассмотренной области, то прошу комментировать. Попробуем решить задачу вместе.

Kamo Petrosyan Автор

Комментарии

    lazy

    (Январь 12, 2017 - 9:16 пп)

    как преобразовать строку 20.01 в float?

      Kamo Petrosyan

      (Февраль 3, 2017 - 12:15 пп)

      Судя по всему fload(‘20.01’)

      Kamo Petrosyan

      (Февраль 3, 2017 - 12:17 пп)

      В посте есть пример функции:

      def str_to_float(str):
      try:
      return float(str)
      except:
      # других вариантов не осталось. скорее всего функция приняла на входе мусор
      return 0

Добавить комментарий

Ваш e-mail не будет опубликован.