001package org.xbib.standardnumber.check.iso7064;
002
003import org.xbib.standardnumber.check.Digit;
004
005public class MOD112 implements Digit {
006
007    @Override
008    public String encode(String digits) {
009        int c = compute(digits);
010        return digits + (c == 10 ? 'X' : c);
011    }
012
013    @Override
014    public boolean verify(String digits) {
015        return compute(getNumber(digits)) == getDigit(digits);
016    }
017
018    @Override
019    public int compute(String digits) {
020        int p = 0;
021        for (int i = 0; i < digits.length(); ++i) {
022            int c = digits.charAt(i) - '0';
023            p = 2 * (p + c);
024        }
025        p = p % 11;
026        return (12 - p) % 11;
027    }
028
029    @Override
030    public int getDigit(String digits) {
031        char c = digits.charAt(digits.length() -1);
032        return  c == 'X' || c == 'x' ? 10 : c - '0';
033    }
034
035    @Override
036    public String getNumber(String digits) {
037        return digits.substring(0, digits.length() -1);
038    }
039
040}