View Javadoc
1   /*
2    * (c) Copyright 2006-2020 by rapiddweller GmbH & Volker Bergmann. All rights reserved.
3    *
4    * Redistribution and use in source and binary forms, with or without
5    * modification, is permitted under the terms of the
6    * GNU General Public License.
7    *
8    * For redistributing this software or a derivative work under a license other
9    * than the GPL-compatible Free Software License as defined by the Free
10   * Software Foundation or approved by OSI, you must first obtain a commercial
11   * license to this software product from rapiddweller GmbH & Volker Bergmann.
12   *
13   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14   * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
15   * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
17   * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24   * POSSIBILITY OF SUCH DAMAGE.
25   */
26  
27  package com.rapiddweller.benerator.util;
28  
29  /**
30   * Provides utility methods for Luhn check digit calculation.<br/><br/>
31   * Created: 18.10.2009 10:06:01
32   *
33   * @author Volker Bergmann
34   * @since 0.6.0
35   */
36  public class LuhnUtil {
37  
38    private LuhnUtil() {
39    }
40  
41    /**
42     * Calculates the last digit expected for a number that passes the Luhn test,
43     * ignoring the last digit. This is useful for creating Luhn numbers.
44     * The actual evaluation if a number passes the test is done by
45     * {@link #luhnValid(CharSequence)}.
46     *
47     * @param number the number
48     * @return the char
49     * @see "http://en.wikipedia.org/wiki/Luhn_algorithm"
50     */
51    public static char requiredCheckDigit(CharSequence number) {
52      int sum = 0;
53      int multiplier = 2;
54      for (int i = number.length() - 2; i >= 0; i--) {
55        int digit = number.charAt(i) - '0';
56        int partialSum = digit * multiplier;
57        sum += (partialSum > 9 ? 1 + (partialSum % 10) : partialSum);
58        multiplier = 1 + (multiplier % 2);
59      }
60      return (char) ('0' + (10 - sum % 10) % 10);
61    }
62  
63    /**
64     * Tests a number against the Luhn algorithm
65     *
66     * @param number the number
67     * @return the boolean
68     * @see #requiredCheckDigit(CharSequence) #requiredCheckDigit(CharSequence)
69     * @see "http://en.wikipedia.org/wiki/Luhn_algorithm"
70     */
71    public static boolean luhnValid(CharSequence number) {
72      return (requiredCheckDigit(number) == number.charAt(number.length() - 1));
73    }
74  
75  }