#python
Пользователь вводит значения через запятую. Предполагается что он ввел числа. Допустимым являются как int, так и float. Как проверить ввел ли пользователь числа или нет ? Я пробовала из введенной строки удалить все пробелы, точки и запятые, а затем проверить .isdigit(). Но мне показалось это решение слишком громоздким. user_num_str = input('Enter numbers separated by commas: ') user_num_str_check = user_num_str.replace(' ', '') user_num_str_check1 = user_num_str_check.replace(',', '') user_num_str_check2 = user_num_str_check1.replace('.', '') if not user_num_str_check2.isdigit(): print('Seams like string!') Буду очень признательна, если посоветуете более простой метод.
Ответы
Ответ 1
Задачу можно разделить на 2 части: 1. Разбить введенные пользователем данные на элементы(через запятую) 2. Проверить, является ли введенный элемент числом Сначала определим функцию проверки на число: def is_number(s): try: float(s) return True except ValueError: return False Допустим пользователь ввел строку: s = "0 1.2.3, 11, 22, 33, 56.52, .225, 1.000000e+50, 1e50, NAN" Тогда ее можно будет разбить на отдельные элементы: lst = s.split(',') И проверить, является ли каждый элемент числом или нет: for element in lst: print(element, end='') if is_number(element): print(" - число") else: print(" - не число") Вывод: 01.2.3 - не число 11 - число 22 - число 33 - число 56.52 - число .225 - число 1.000000e+50 - число 1e50 - число NAN - число Обратите внимание, что такой подход признает NAN числом, так как float('NAN') обработается без ошибки. То же самое с True и False. Надо ли проверку на NAN, True, False - это отдельный вопрос. Во всяком случае текущая функция проверит, что с введенными данными вы дальше сможете работать как с числами. PS Использовать try except с приведением строки к числу возможно возможно не самый лучший вариант. Однако я не знаю другого хорошего простого варианта проверять числа 1e50 или .125. Есть несколько альтернативных вариантов: 1. Использовать регулярки, но как мне кажется они сложнее для понимания. И регулярку, которая будет одновременно воспринимать и научные способы записи вида 1e50 и записи .5552 будет выглядеть довольно сложно. Как говорится, у нас была проблема. Мы решили ее регуляркой, теперь у нас 2 проблемы 2. Использовать str.isnumeric() или str.isdigit() Тогда у всех элементов в листе надо удалить лишние пробелы lst = [e.replace(' ', '') for e in lst] И снова проверить: for element in lst: print(element, end='') if element.isdigit(): print(" - число") else: print(" - не число") Вывод: 01.2.3 - не число 11 - число 22 - число 33 - число 56.52 - не число .225 - не число 1.000000e+50 - не число 1e50 - не число NAN - не число Однако, этот способ проверяет только, что строка состоит из чисел. По этому числа с плавающей точкой или с e не будут признаны числами. Так же это не сработает для отрицательных чисел.
Комментариев нет:
Отправить комментарий