org.apache.commons.validator.routines.checkdigit

## Class ModulusTenCheckDigit

- java.lang.Object
- - org.apache.commons.validator.routines.checkdigit.ModulusCheckDigit
  - - org.apache.commons.validator.routines.checkdigit.ModulusTenCheckDigit

- All Implemented Interfaces:
    Serializable, CheckDigit

      public final class ModulusTenCheckDigit
      extends ModulusCheckDigit

  General Modulus 10 Check Digit calculation/validation.

  ## How it Works

  This implementation calculates/validates the check digit in the following way:

  - Converting each character to an integer value using `Character.getNumericValue(char)` - negative integer values from that method are invalid.
  - Calculating a weighted value by multiplying the character's integer value by a weighting factor. The weighting factor is selected from the configured `postitionWeight` array based on its position. The `postitionWeight` values are used either left-to-right (when `useRightPos=false`) or right-to-left (when `useRightPos=true`).
  - If `sumWeightedDigits=true`, the weighted value is re-calculated by summing its digits.
  - The weighted values of each character are totalled.
  - The total modulo 10 will be zero for a code with a valid Check Digit.

  ## Limitations

  This implementation has the following limitations:

  - It assumes the last character in the code is the Check Digit and validates that it is a numeric character.
  - The only limitation on valid characters are those that `Character.getNumericValue(char)` returns a positive value. If, for example, the code should only contain numbers, this implementation does not check that.
  - There are no checks on code length.

  Note: This implementation can be combined with the `CodeValidator` in order to ensure the length and characters are valid.

  ## Example Usage

  This implementation was added after a number of Modulus 10 routines and these are shown re-implemented using this routine below:

  ABA Number Check Digit Routine (equivalent of `ABANumberCheckDigit`). Weighting factors are `[1, 7, 3]` applied from right to left.

       CheckDigit routine = new ModulusTenCheckDigit(new int[] { 1, 7, 3 }, true);

  CUSIP Check Digit Routine (equivalent of `CUSIPCheckDigit`). Weighting factors are `[1, 2]` applied from right to left and the digits of the weighted value are summed.

       CheckDigit routine = new ModulusTenCheckDigit(new int[] { 1, 2 }, true, true);

  EAN-13 / UPC Check Digit Routine (equivalent of `EAN13CheckDigit`). Weighting factors are `[1, 3]` applied from right to left.

       CheckDigit routine = new ModulusTenCheckDigit(new int[] { 1, 3 }, true);

  Luhn Check Digit Routine (equivalent of `LuhnCheckDigit`). Weighting factors are `[1, 2]` applied from right to left and the digits of the weighted value are summed.

       CheckDigit routine = new ModulusTenCheckDigit(new int[] { 1, 2 }, true, true);

  SEDOL Check Digit Routine (equivalent of `SedolCheckDigit`). Weighting factors are `[1, 3, 1, 7, 3, 9, 1]` applied from left to right.

       CheckDigit routine = new ModulusTenCheckDigit(new int[] { 1, 3, 1, 7, 3, 9, 1 });

  Since:
    Validator 1.6
  Version:
    $Revision: 1739356 $
  See Also:
    Serialized Form

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `ModulusTenCheckDigit(int[] postitionWeight)` Construct a modulus 10 Check Digit routine with the specified weighting from left to right.
    `ModulusTenCheckDigit(int[] postitionWeight, boolean useRightPos)` Construct a modulus 10 Check Digit routine with the specified weighting, indicating whether its from the left or right.
    `ModulusTenCheckDigit(int[] postitionWeight, boolean useRightPos, boolean sumWeightedDigits)` Construct a modulus 10 Check Digit routine with the specified weighting, indicating whether its from the left or right and whether the weighted digits should be summed.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `isValid(String code)` Validate a modulus check digit for a code.
    `protected int` | `toInt(char character, int leftPos, int rightPos)` Convert a character at a specified position to an integer value.
    `String` | `toString()` Return a string representation of this implementation.
    `protected int` | `weightedValue(int charValue, int leftPos, int rightPos)` Calculates the weighted value of a character in the code at a specified position.

    - ### Methods inherited from class org.apache.commons.validator.routines.checkdigit.ModulusCheckDigit

      `calculate, calculateModulus, getModulus, sumDigits, toCheckDigit`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### ModulusTenCheckDigit

          public ModulusTenCheckDigit(int[] postitionWeight)

      Construct a modulus 10 Check Digit routine with the specified weighting from left to right.
      Parameters:
        `postitionWeight` - the weighted values to apply based on the character position

    - #### ModulusTenCheckDigit

          public ModulusTenCheckDigit(int[] postitionWeight,
                                      boolean useRightPos)

      Construct a modulus 10 Check Digit routine with the specified weighting, indicating whether its from the left or right.
      Parameters:
        `postitionWeight` - the weighted values to apply based on the character position
        `useRightPos` - `true` if use positionWeights from right to left

    - #### ModulusTenCheckDigit

          public ModulusTenCheckDigit(int[] postitionWeight,
                                      boolean useRightPos,
                                      boolean sumWeightedDigits)

      Construct a modulus 10 Check Digit routine with the specified weighting, indicating whether its from the left or right and whether the weighted digits should be summed.
      Parameters:
        `postitionWeight` - the weighted values to apply based on the character position
        `useRightPos` - `true` if use positionWeights from right to left
        `sumWeightedDigits` - `true` if sum the digits of the weighted value

  - ### Method Detail

    - #### isValid

          public boolean isValid(String code)

      Validate a modulus check digit for a code.

      Note: assumes last digit is the check digit

      Specified by:
        `isValid` in interface `CheckDigit`
      Overrides:
        `isValid` in class `ModulusCheckDigit`
      Parameters:
        `code` - The code to validate
      Returns:
        `true` if the check digit is valid, otherwise `false`

    - #### toInt

          protected int toInt(char character,
                              int leftPos,
                              int rightPos)
                       throws CheckDigitException

      Convert a character at a specified position to an integer value.

      Note: this implementation only handlers values that Character.getNumericValue(char) returns a non-negative number.

      Overrides:
        `toInt` in class `ModulusCheckDigit`
      Parameters:
        `character` - The character to convert
        `leftPos` - The position of the character in the code, counting from left to right (for identifying the position in the string)
        `rightPos` - The position of the character in the code, counting from right to left (not used here)
      Returns:
        The integer value of the character
      Throws:
        `CheckDigitException` - if Character.getNumericValue(char) returns a negative number

    - #### weightedValue

          protected int weightedValue(int charValue,
                                      int leftPos,
                                      int rightPos)

      Calculates the weighted value of a character in the code at a specified position.
      Specified by:
        `weightedValue` in class `ModulusCheckDigit`
      Parameters:
        `charValue` - The numeric value of the character.
        `leftPos` - The position of the character in the code, counting from left to right
        `rightPos` - The position of the character in the code, counting from right to left
      Returns:
        The weighted value of the character.

    - #### toString

          public String toString()

      Return a string representation of this implementation.
      Overrides:
        `toString` in class `Object`
      Returns:
        a string representation

Copyright © 2002–2020 The Apache Software Foundation. All rights reserved.