# validation.isbn
Checks an International Standard Book Number in either form and hands back
both. The answer is always normalised to the ISBN-13, because that is the form
every ISBN has had since 2007 and the one to store and compare: the ISBN-10
0-306-40615-2 and the ISBN-13 978-0-306-40615-7 are the same book.
TWO CHECK DIGITS, TWO ALGORITHMS:
- ISBN-10: weight the ten characters 10, 9, 8 ... 1 and the sum must be a
multiple of 11. The check digit can therefore be 10, written `X` (or `x`),
and `X` is allowed only in that last position.
- ISBN-13: the GS1/EAN-13 rule - weights 1, 3, 1, 3 ... from the left, and the
check digit brings the sum to a multiple of 10. The first three digits must
be 978 or 979 ("Bookland"); any other EAN-13 is a barcode, not an ISBN.
CONVERSION is where naive code goes wrong: the two check digits are computed
differently, so converting means recomputing, never copying the old check
digit across. An ISBN-10 becomes `978` + its first nine digits + a fresh EAN
check digit. An ISBN-13 has an ISBN-10 only when it starts with 978; `979`
ISBNs (issued since the 978 range began running out) have none, and `isbn10`
is null for them.
ACCEPTED INPUT: ASCII digits and `X`, with ASCII spaces and hyphens ignored
anywhere (hyphen positions depend on the registration group and publisher, so
they are not checked), and an optional leading `ISBN` in any case, optionally
followed by a colon: `ISBN 978-0-306-40615-7`, `isbn:0306406152`. Forms such as
`ISBN-13:` are not recognised.
| reason | meaning |
|-------------------|------------------------------------------------------------------|
| `empty` | nothing left after removing separators and the prefix, or not a string |
| `bad-character` | a character other than a digit, `X`, space or hyphen |
| `bad-length` | not 10 or 13 characters |
| `bad-format` | an `X` anywhere but the last place of an ISBN-10 |
| `bad-prefix` | a 13-digit number that does not start with 978 or 979 |
| `bad-check-digit` | the check digit does not match |
The checks run in that order; the first failure is the reason. Validators
answer rather than throw.
A valid ISBN is well formed, not necessarily assigned: only the ISBN agency's
records say whether a book carries it. Hyphenation (splitting into group,
publisher, title and check) needs the International ISBN Agency's range table
and is out of scope.
Source: International ISBN Agency, ISBN Users' Manual, 7th edition, sections
5 and 9 (https://www.isbn-international.org/content/isbn-users-manual).