Objectif Lune joins Upland Software.Learn more >

Back to all How-tos

Calculating the LUHN Check Digit in Connect

Original Author: Rodrigue Noubissie

Introduction

The Luhn algorithm was developed by German computer scientist Hans Peter Luhn in 1954. It calculates a simple checksum formula used to validate identification numbers such as credit card numbers, IMEI numbers, etc.. The algorithm was designed to protect against accidental errors, such as a digit mistyping. It will detect any single-digit error, as well as almost all transpositions of adjacent digits. It will not, however, detect transposition of the two-digit sequence 09 to 90 (or vice versa).

More information is available in this Wikipedia article.

Several users have requested ways to calculate the Luhn Checksum in Connect.

The Luhn Check Digit Algorithm

This algorithm allows checking credit card numbers MasterCard/AMEX/Visa or IMEI codes for example by using a control key checksum. If one character is mistyped, the Luhn algorithm can detect it.

Example: 18-digit number without Luhn Check Digit: 872560021439746445

Step 1:

The algorithm starts at the end of the number, from the most right digit to the first left digit. Double all digits of even rank.

First Table

Step 2

If the double of a digit is equal or greater than 10, replace the result by the sum of digits in the double. Alternatively, simply take away 9 from the result of the double.

Second Table

Then sum all the digits: 8+(1+4)+2+(1+0)+6+(0)+0+(4)+1+(8)+3+(1+8)+7+(8)+6+(8)+4+(1+0) = 81

Step 3

The control digit number is equal to 10-(sum%10): 10-(81%10) =10-1=9 The Luhn Check Digit at position 19 will therefore be 9.

Calculation of the Luhn Check Digit

The below functions can be called in a Connect data mapping configuration, template and output presets to calculate the Luhn Check digit, to return the full code as well as for verifying whether a code satisfies the Luhn Algorithm.

//Return the check digit.

function luhnCheckDigitCalculate(code) {
    code+="0";
    var codeLength = code.length;
    var codeLengthParity = codeLength % 2;
    var luhnChecksum = 0;
    var luhnCheckDigit;
    for (var i = codeLength-1; i >= 0; i--) {
        var luhnDigit = parseInt(code.charAt(i));
        if (i % 2 == codeLengthParity){luhnDigit *= 2;}
        if (luhnDigit > 9){luhnDigit -= 9;}
        luhnChecksum += luhnDigit;
    }
    luhnCheckDigit = luhnChecksum %10;
    return (luhnCheckDigit == 0) ? 0 : 10 - luhnCheckDigit;
}

//Return a full code, including check digit

function luhnFullCodeCalculate(code){
    return code.toString() + luhnCheckDigitCalculate(code).toString();
}

//Return true if specified code (with check digit) is valid.

function luhnValidate(fullCode){
    return luhnCheckDigitCalculate(fullCode) == 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *

All comments (1)

  • Sharne

    Thanks for this. I knew it would come in handy one day and today is the day.
    Regards,
    S