Skip to content

Instantly share code, notes, and snippets.

@ertaquo
Created September 26, 2016 08:59
Show Gist options
  • Save ertaquo/28ecf3c3b14251c8a3971d57974db400 to your computer and use it in GitHub Desktop.
Save ertaquo/28ecf3c3b14251c8a3971d57974db400 to your computer and use it in GitHub Desktop.
Utils to validate and format credit card numbers
var validatePAN = function(pan){
pan = pan.replace(/[^\d]+/g, '');
if (pan.length < 12)
return false;
var even = false;
var check = 0;
for (var i = pan.length - 1; i >= 0; i--) {
var n = pan[i]|0;
if (even) {
n *= 2;
if (n > 9)
n -= 9;
}
check += n;
even = !even;
}
return (check % 10) == 0;
}
var formatPAN = function(input){
var getCaretPosition = function(input){
if ('selectionStart' in input) {
// Standard-compliant browsers
return input.selectionStart;
} else if (document.selection) {
// IE
input.focus();
var sel = document.selection.createRange();
var selLen = document.selection.createRange().text.length;
sel.moveStart('character', -input.value.length);
return sel.text.length - selLen;
}
}
var setCaretPosition = function(input, position){
if ('selectionStart' in input) {
// Standard-compliant browsers
input.setSelectionRange(position, position);
} else {
// IE
var range = input.createTextRange();
range.move('character', position);
range.select();
}
}
var caretPosition = getCaretPosition(input);
var caretOffset = 0;
var pan = input.value;
var panGroups = [];
var lastPanGroup = '';
for (var i = 0; i < pan.length; i++) {
if (isNaN(parseInt(pan[i]))) {
if (i < caretPosition) {
caretOffset--;
}
} else {
lastPanGroup += pan[i];
if (lastPanGroup.length == 4) {
panGroups.push(lastPanGroup);
lastPanGroup = '';
}
}
}
panGroups.push(lastPanGroup);
pan = panGroups.join(' ').trim();
caretOffset += (caretPosition / 5.0)|0;
input.value = pan;
setCaretPosition(input, caretPosition + caretOffset);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment