Created
September 26, 2016 08:59
-
-
Save ertaquo/28ecf3c3b14251c8a3971d57974db400 to your computer and use it in GitHub Desktop.
Utils to validate and format credit card numbers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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