TheAlgorithms-Python
73 строки · 2.3 Кб
1NUMBERS_PLUS_LETTER = "Input must be a string of 8 numbers plus letter"
2LOOKUP_LETTERS = "TRWAGMYFPDXBNJZSQVHLCKE"
3
4
5def is_spain_national_id(spanish_id: str) -> bool:
6"""
7Spain National Id is a string composed by 8 numbers plus a letter
8The letter in fact is not part of the ID, it acts as a validator,
9checking you didn't do a mistake when entering it on a system or
10are giving a fake one.
11
12https://en.wikipedia.org/wiki/Documento_Nacional_de_Identidad_(Spain)#Number
13
14>>> is_spain_national_id("12345678Z")
15True
16>>> is_spain_national_id("12345678z") # It is case-insensitive
17True
18>>> is_spain_national_id("12345678x")
19False
20>>> is_spain_national_id("12345678I")
21False
22>>> is_spain_national_id("12345678-Z") # Some systems add a dash
23True
24>>> is_spain_national_id("12345678")
25Traceback (most recent call last):
26...
27ValueError: Input must be a string of 8 numbers plus letter
28>>> is_spain_national_id("123456709")
29Traceback (most recent call last):
30...
31ValueError: Input must be a string of 8 numbers plus letter
32>>> is_spain_national_id("1234567--Z")
33Traceback (most recent call last):
34...
35ValueError: Input must be a string of 8 numbers plus letter
36>>> is_spain_national_id("1234Z")
37Traceback (most recent call last):
38...
39ValueError: Input must be a string of 8 numbers plus letter
40>>> is_spain_national_id("1234ZzZZ")
41Traceback (most recent call last):
42...
43ValueError: Input must be a string of 8 numbers plus letter
44>>> is_spain_national_id(12345678)
45Traceback (most recent call last):
46...
47TypeError: Expected string as input, found int
48"""
49
50if not isinstance(spanish_id, str):
51msg = f"Expected string as input, found {type(spanish_id).__name__}"
52raise TypeError(msg)
53
54spanish_id_clean = spanish_id.replace("-", "").upper()
55if len(spanish_id_clean) != 9:
56raise ValueError(NUMBERS_PLUS_LETTER)
57
58try:
59number = int(spanish_id_clean[0:8])
60letter = spanish_id_clean[8]
61except ValueError as ex:
62raise ValueError(NUMBERS_PLUS_LETTER) from ex
63
64if letter.isdigit():
65raise ValueError(NUMBERS_PLUS_LETTER)
66
67return letter == LOOKUP_LETTERS[number % 23]
68
69
70if __name__ == "__main__":
71import doctest
72
73doctest.testmod()
74