用JavaScript实现Luhn算法
我正在尝试将一个Luhm算法实现移植到JavaScript中,这是用C#实现的。我把它移植过来了,我以为它能用,但我无法得到合法的卡来验证。我的美国运通可以验证罚款,但我的两个签证拒绝这样做。代码如下:用JavaScript实现Luhn算法,javascript,luhn,Javascript,Luhn,我正在尝试将一个Luhm算法实现移植到JavaScript中,这是用C#实现的。我把它移植过来了,我以为它能用,但我无法得到合法的卡来验证。我的美国运通可以验证罚款,但我的两个签证拒绝这样做。代码如下: luhn = function (number) { var _deltas = [0, 1, 2, 3, 4, -4, -3, -2, -1, 0], _checksum = 0, _digits = [], i, j;
luhn = function (number) {
var _deltas = [0, 1, 2, 3, 4, -4, -3, -2, -1, 0],
_checksum = 0,
_digits = [],
i,
j;
while (number != 0) {
_digits.push(parseInt((number % 10), 10));
number = parseInt((number / 10), 10);
}
for (i = (_digits.length - 1), j = _digits.length; i > -1; i--) {
_digit = _digits[i];
_checksum += _digit;
_checksum += ((((i - j) % 2) === 0) ? _deltas[_digit] : 0);
}
return ((_checksum % 10) === 0);
};
有人能告诉我哪里不对吗?我原以为这在C版本中效果不错,但现在我有点怀疑。。。提前谢谢
<script>
// takes the form field value and returns true on valid number
function valid_credit_card(value) {
// accept only digits, dashes or spaces
if (/[^0-9-\s]+/.test(value)) return false;
// The Luhn Algorithm. It's so pretty.
var nCheck = 0, nDigit = 0, bEven = false;
value = value.replace(/\D/g, "");
for (var n = value.length - 1; n >= 0; n--) {
var cDigit = value.charAt(n),
nDigit = parseInt(cDigit, 10);
if (bEven) {
if ((nDigit *= 2) > 9) nDigit -= 9;
}
nCheck += nDigit;
bEven = !bEven;
}
return (nCheck % 10) == 0;
}
console.log(valid_credit_card("5610591081018250"),"valid_credit_card Validation");
</script>
//接受表单字段值,并在有效数字上返回true
功能有效的信用卡(值){
//仅接受数字、破折号或空格
如果(/[^0-9-\s]+/.test(value))返回false;
//卢恩算法,非常漂亮。
var nCheck=0,nDigit=0,bEven=false;
值=值。替换(/\D/g,“”);
对于(var n=value.length-1;n>=0;n--){
var cDigit=值。字符(n),
nDigit=parseInt(cDigit,10);
如果(贝文){
如果((nDigit*=2)>9)nDigit-=9;
}
nCheck+=nDigit;
贝文=!贝文;
}
返回值(n检查%10)=0;
}
控制台日志(有效的信用卡(“5610591081018250”),“有效的信用卡验证”);
这里的最佳解决方案
函数validateCard(num){
var oddSum=0;
var-evenSum=0;
var numToString=num.toString().split(“”);
对于(变量i=0;i=10){
evenSum+=((numToString[i]*2)-9);
}否则{
evenSum+=numToString[i]*2;
}
}否则{
oddSum+=parseInt(numToString[i]);
}
}
返回值(oddSum+evenSum)%10==0;
}
日志(validateCard(41111111))代码>此解决方案接受数组作为参数。如果其valid返回true,如果其invalid返回false
function validateCred(arr) {
let sumArray = [];
let numHolder = null;
let everySecondNumber = 1;
for (let i = arr.length - 1; i >= 0; i--) {
if (everySecondNumber % 2 === 0) {
numHolder = arr[i] * 2;
if (numHolder > 9) {
numHolder -= 9;
}
} else {
numHolder = arr[i];
}
sumArray.push(numHolder);
everySecondNumber++;
}
totalSum = sumArray.reduce((acc,val) => acc + val, 0);
if (totalSum % 10 == 0) {
return true;
} else {
return false;
}
}
提示:alert(parseInt(“545111875046384725”,10))
和。这适用于此处的示例:但可能不适用于较大的数字。