Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Проверить, что в строке число

#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 не будут признаны числами. Так же это не сработает для отрицательных чисел.

Комментариев нет:

Отправить комментарий