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