001package org.xbib.standardnumber.check.iso7064;
002
003import org.xbib.standardnumber.check.Digit;
004
005public class MOD3736 implements Digit {
006
007    private final static String ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
008
009    @Override
010    public String encode(String digits) {
011        int c = compute(digits);
012        return digits + c;
013    }
014
015    @Override
016    public boolean verify(String digits) {
017        return compute(digits) == 1;
018    }
019
020    @Override
021    public int compute(String digits) {
022        int modulus = ALPHABET.length();
023        int check = modulus / 2;
024        for (int i = 0; i < digits.length(); i++) {
025            check = (((check > 0 ? check : modulus) * 2) % (modulus + 1)
026                    + ALPHABET.indexOf(digits.charAt(i))) % modulus;
027        }
028        return check;
029    }
030
031    @Override
032    public int getDigit(String digits) {
033        return digits.charAt(digits.length() - 1);
034    }
035
036    @Override
037    public String getNumber(String digits) {
038        return digits.substring(0, digits.length() - 1);
039    }
040
041}