GST number validation is done through 2 steps
- Check if there is a character in position of a character and a number in position of a number.
- Validate the check digit that is the last character in the GST no. with Luhn mod N algorithm (https://en.wikipedia.org/wiki/Luhn_mod_N_algorithm)
An implementation in javascript
let GST = {
/*
Luhn mod N algorithm
https://en.wikipedia.org/wiki/Luhn_mod_N_algorithm
*/
chars: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
pattern: /[0-9]{2}[a-zA-Z]{5}[0-9]{4}[a-zA-Z]{1}[1-9A-Za-z]{1}[Zz1-9A-Ja-j]{1}[0-9a-zA-Z]{1}/,
generate_check_charcter: function(input) {
factor = 2;
sum = 0;
n = this.number_of_valid_input_chars();
for (i = input.length - 1; i >= 0; i--) {
code_point = this.code_point_from_char(input[i]);
addend = factor * code_point;
factor = (factor == 2) ? 1 : 2;
addend = (addend / n) + (addend % n);
sum += Math.floor(addend);
}
remainder = sum % n;
check_code_point = (n - remainder) % n;
return this.char_from_code_point(check_code_point);
},
validate_check_character: function(input) {
factor = 1;
sum = 0;
n = this.number_of_valid_input_chars();
for (i = input.length - 1; i >= 0; i--) {
code_point = this.code_point_from_char(input[i]);
addend = factor * code_point;
factor = (factor == 2) ? 1 : 2;
addend = parseInt(addend / n) + (addend % n);
sum += addend;
}
remainder = sum % n;
return (remainder == 0);
},
number_of_valid_input_chars: function() {
return this.chars.length;
},
code_point_from_char: function(input) {
let str = this.chars;
for (let i = 0, q = str.length; i < q; i++) {
if (input == str[i]) {
return i;
}
}
},
char_from_code_point: function(input) {
let str = this.chars;
for (let i = 0, q = str.length; i < q; i++) {
if (input == i) {
return str[i];
}
}
},
/*
Function called to check if a GSTno is valid.
Full GST.no is passed to the func
*/
is_valid_num: function(gst_no) {
//Check for pattern
var patt = new RegExp(this.pattern);
if (!patt.test(gst_no)) {
console.log('pattern wrong');
return false;
}
//Validate the check digit
return this.validate_check_character(gst_no);
}
};
USAGE:
GST.is_valid_num(gst_no);
true is returned if the GST.no is valid. false if not.
Comment below if you have any questions.