It would be great if the app could send a barcode number to the web service without the user being forced to decide upfront what kind of barcode is being sent, e.g. a barcode used by the library or an ISBN number. Clearly, the service needs to know what kind of number it is dealing with to make a sensible decision on what bibliographic source to query.
I’m exploring the use of validators to help the service to determine what type of value we are dealing with. At the moment, the interface is pretty simple:
public interface Validator { boolean validate(final String value); }
Basically, an implementation would take a value and determine whether or not it believes it is valid. The first implementation developed covers the barcode numbers used by the Library at the University of Bristol.
Barcodes at the University are ten digits long and follow the following format:
- The first digit is the prefix and is always the number 1
- The second through to the 9th digit will be from the range 0 to 9.
- The tenth digit is the check digit and can range from 0 to 9 or be the character X
The validator can therefore declare any value it receives that is not 10 digits in length as invalid. It can also dismiss any 10 digit numbers that don’t start with 1. Beyond that we need to apply an algorithm that determines the validity of the check digit (tenth digit) against the other numbers (excluding the prefix).
Each number is multiplied against a relevant weighting in the following list: {7, 8, 4, 6, 3, 5, 2, 1}. Modulus 11 is then used on the sum of the weighted values to get a remainder. The remainder is then subtracted against 11 to get the check digit value. If the value is 10, then that is represented by the character X. Clear as mud?
So, for the barcode 1511075964, we ignore the prefix and multiply the next 8 digits against the appropriate number in the weightings list:
(5 x 7) + (1 x 8) + (1 x 4) + (0 x 6) + (7 x 3) + (5 x 5) + (9 x 2) + (6 x 1) = 117
Find the remainder:
117 % 11 = 7
Subtract from 11 to find the check digit:
11 – 7 = 4
Therefore, 1511075964 is a valid University barcode because the last number matches the check digit created by the algorithm.
ISBN 10 numbers have ten digits but use a different weighting to calculate the check digit. It will be interesting to calculate the probability of a clash – the possibility of a number being a valid University barcode number and a valid ISBN 10 number.