Haikson

[ Everything is possible. Everything takes time. ]

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
Ну и напоследок, если у вас есть комментарии или более интересные задачи из выше рассмотренной области, то прошу комментировать. Попробуем решить задачу вместе.