fix integer validation lab 1
This commit is contained in:
+11
-3
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user