Skip to content

Commit 737f38c

Browse files
authored
Merge pull request #126 from ikostan/main
Update from master
2 parents 7e50a2c + 66dbd2d commit 737f38c

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""
2+
ISBN Verifier.
3+
4+
The ISBN-10 verification process is used to validate book identification
5+
numbers. These normally contain dashes and look like: 3-598-21508-8
6+
7+
ISBN
8+
The ISBN-10 format is 9 digits (0 to 9) plus one check character
9+
(either a digit or an X only). In the case the check character is an X,
10+
this represents the value '10'. These may be communicated with or without
11+
hyphens, and can be checked for their validity by the following formula:
12+
13+
(d₁ * 10 + d₂ * 9 + d₃ * 8 + d₄ * 7 + d₅ * 6 +
14+
d₆ * 5 + d₇ * 4 + d₈ * 3 + d₉ * 2 + d₁₀ * 1) mod 11 == 0
15+
16+
If the result is 0, then it is a valid ISBN-10, otherwise it is invalid.
17+
"""
18+
19+
20+
def is_valid(isbn: str) -> bool:
21+
"""
22+
Verify ISBN.
23+
24+
:param isbn: 9 digits ISBN 10 format
25+
:return: Tru if isbn is valid, False otherwise
26+
"""
27+
isbn_digits: list[int] = []
28+
for char in isbn:
29+
if char == "-":
30+
continue
31+
elif char.isdigit():
32+
isbn_digits.append(int(char))
33+
elif char.upper() == "X" and len(isbn_digits) == 9:
34+
isbn_digits.append(10)
35+
else:
36+
return False
37+
# ISBN total length should be = 10
38+
if len(isbn_digits) != 10:
39+
return False
40+
41+
return (
42+
sum(digit * (10 - i) for i, digit in enumerate(isbn_digits)) % 11 == 0
43+
)

0 commit comments

Comments
 (0)