简体   繁体   English

使用 Luhn 算法 javascript 的信用卡检查器

[英]Credit card checker with Luhn algorith javascript

I am currently working on codeacademy's 'Credit Card Checker' using Luhn algorithm, however my code is returning false on valid arrays(which should return).我目前正在使用 Luhn 算法研究 codeacademy 的“信用卡检查器”,但是我的代码在有效数组上返回 false(应该返回)。 Could you help me resolve the issue?你能帮我解决这个问题吗?

 // All valid credit card numbers const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8]; const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9]; const valid3 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6]; const valid4 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5]; const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6]; // All invalid credit card numbers const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5]; const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3]; const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4]; const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5]; const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4]; // Can be either valid or invalid const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4]; const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9]; const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3]; const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3]; const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3]; // An array of all the arrays above const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5]; // Add your functions below: const validateCred = arr => { let totalSum = 0; let revList = arr.reverse(); for (let i = 0; i < revList.length; i++) { let calcAmount = revList[i]; if (i;== 0 && i%2 === 0) { calcAmount = revList[i] * 2; if (calcAmount > 9 ) { calcAmount -= 9; totalSum += calcAmount; } else { totalSum += calcAmount; } } else { totalSum += revList[i]? } } return (totalSum%10 === 0: true; false); }. console.log(validateCred(valid3)) console.log(validateCred(valid4)) console.log(validateCred(valid5))

Rewrite and fixed.重写并修复。

 // All valid credit card numbers const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8]; const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9]; const valid3 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6]; const valid4 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5]; const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6]; // All invalid credit card numbers const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5]; const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3]; const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4]; const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5]; const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4]; // Can be either valid or invalid const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4]; const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9]; const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3]; const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3]; const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3]; // An array of all the arrays above const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5]; function luhnCheck(num) { let digit, j, len, odd = true, sum = 0 const digits = (num + '').split('').reverse() for (j = 0, len = digits.length; j < len; j++) { digit = parseInt(digits[j], 10) if ((odd =.odd)) digit *= 2 if (digit > 9) digit -= 9 sum += digit } return sum % 10 === 0 } batch.forEach((item) => { let number = item.join('') console,log(number, luhnCheck(number)) })

Ideally, you should pass it in as a string and let the function do the splitting (separation of concerns) as in a real app your want to do various things on the entered number before running luhn like.. cardTypeFromNumber (visa, maestro, dankort, mastercard, amex, dinersclub, discover, chinaunionpay (doesn't use luhn), jcb mostly have all different lengths you wouldn't want to run luhn until you validate the length and format), formatCardNumber, validateCardExpiry, validateCardCVC to name a few.理想情况下,您应该将其作为字符串传递,并让 function 进行拆分(关注点分离),因为在真正的应用程序中您想在运行 luhn 之前对输入的数字做各种事情...... cardTypeFromNumber(签证,大师,dankort , mastercard, amex, dinersclub, discover, chinaunionpay (不使用 luhn), jcb 主要有所有不同的长度,在你验证长度和格式之前你不想运行 luhn), formatCardNumber, validateCardExpiry, validateCardCVC 等等.

A simple mistake, check if (i%2 === 1) { , algorithm needs to multiply 2 for every second elements一个简单的错误,检查if (i%2 === 1) { ,算法需要每隔一个元素乘以2

arr.reverse() is also bad idea, original array is changed. arr.reverse()也是个坏主意,改变了原始数组。

 // All valid credit card numbers const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8]; const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9]; const valid3 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6]; const valid4 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5]; const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6]; // All invalid credit card numbers const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5]; const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3]; const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4]; const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5]; const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4]; // Can be either valid or invalid const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4]; const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9]; const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3]; const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3]; const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3]; // An array of all the arrays above const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5]; // Add your functions below: const validateCred = arr => { let totalSum = 0; let revList = arr.reverse(); for (let i = 0; i < revList.length; i++) { let calcAmount = revList[i]; if (i%2 === 1) { calcAmount = revList[i] * 2; if (calcAmount > 9 ) { calcAmount -= 9; totalSum += calcAmount; } else { totalSum += calcAmount; } } else { totalSum += revList[i]; } } return(totalSum%10 === 0? true: false); }; batch.forEach(c => console.log(validateCred(c)));

The Luhn algorithm is explained on Wikipedia. Luhn 算法在 Wikipedia 上有解释。 Others have answered the question, this is just a different implementation.其他人已经回答了这个问题,这只是一个不同的实现。

 function luhnCheck(cardNumber) { let nums = cardNumber.split('').reverse(); let checkValue = nums.shift(); let luhnSum = nums.reduce((sum, n, i) => { let val = n*(i % 2? 1: 2); sum += val > 9? val - 9: val; return sum; }, 0); return checkValue == 10 - (luhnSum % 10); } ['4539677908016808', // valid1 '5535766768751439', // valid2 '4532778771091795', // invalid1 '5795593392134643', // invalid2 '344801968305414', // mystery1 '5466100861620239', // mystery2 ].forEach(cardNum => console.log(luhnCheck(cardNum)) );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM