fix integer validation lab 1
This commit is contained in:
+11
-3
@@ -1,9 +1,12 @@
|
||||
from decimal import Decimal, InvalidOperation
|
||||
import re
|
||||
|
||||
COUNT = 20
|
||||
HEADER = "Лабораторная работа №1"
|
||||
TASK = "Задача: найти максимальный элемент списка и поменять его с первым"
|
||||
FORMAT_HINT = "Можно вводить числа в формате: 10, -5.3, 1e20\n"
|
||||
FORMAT_HINT = "Можно вводить только целые числа: 10, -5, 1e20\n"
|
||||
|
||||
INTEGER_INPUT_PATTERN = re.compile(r"^[+-]?\d+(?:[eE][+-]?\d+)?$")
|
||||
|
||||
|
||||
def parse_number(user_input: str) -> tuple[Decimal, bool]:
|
||||
@@ -11,17 +14,22 @@ def parse_number(user_input: str) -> tuple[Decimal, bool]:
|
||||
if normalized == "":
|
||||
raise ValueError("Ошибка: пустой ввод. Повторите.")
|
||||
|
||||
if not INTEGER_INPUT_PATTERN.fullmatch(normalized):
|
||||
raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).")
|
||||
|
||||
used_scientific = "e" in normalized.lower()
|
||||
normalized = normalized.replace(",", ".")
|
||||
|
||||
try:
|
||||
number = Decimal(normalized)
|
||||
except InvalidOperation as error:
|
||||
raise ValueError("Ошибка: это не число. Попробуйте снова.") from error
|
||||
raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).") from error
|
||||
|
||||
if not number.is_finite():
|
||||
raise ValueError("Ошибка: число должно быть конечным.")
|
||||
|
||||
if number != number.to_integral_value():
|
||||
raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).")
|
||||
|
||||
return number, used_scientific
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user