fix integer validation lab 1

This commit is contained in:
2026-04-01 13:51:44 +07:00
parent b4a49a98f6
commit dcf434bd10
+11 -3
View File
@@ -1,9 +1,12 @@
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
import re
COUNT = 20 COUNT = 20
HEADER = "Лабораторная работа №1" HEADER = "Лабораторная работа №1"
TASK = "Задача: найти максимальный элемент списка и поменять его с первым" 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]: def parse_number(user_input: str) -> tuple[Decimal, bool]:
@@ -11,17 +14,22 @@ def parse_number(user_input: str) -> tuple[Decimal, bool]:
if normalized == "": if normalized == "":
raise ValueError("Ошибка: пустой ввод. Повторите.") raise ValueError("Ошибка: пустой ввод. Повторите.")
if not INTEGER_INPUT_PATTERN.fullmatch(normalized):
raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).")
used_scientific = "e" in normalized.lower() used_scientific = "e" in normalized.lower()
normalized = normalized.replace(",", ".")
try: try:
number = Decimal(normalized) number = Decimal(normalized)
except InvalidOperation as error: except InvalidOperation as error:
raise ValueError("Ошибка: это не число. Попробуйте снова.") from error raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).") from error
if not number.is_finite(): if not number.is_finite():
raise ValueError("Ошибка: число должно быть конечным.") raise ValueError("Ошибка: число должно быть конечным.")
if number != number.to_integral_value():
raise ValueError("Ошибка: введите целое число (например, 10 или 1e3).")
return number, used_scientific return number, used_scientific