我对Javascript非常糟糕,因为我刚刚开始学习。我在查一张16位数的信用卡。这让我发疯了,如果有人能帮我看看,我会很感激的。
<script>
var creditNum;
var valid = new Boolean(true);
creditNum = prompt("Enter your credit card number: ");
if((creditNum==null)||(creditNum=="")){
valid = false;
alert("Invalid Number!\nThere was no input.");
}else if(creditNum.length!=16){
valid = false;
alert("Invalid Number!\nThe number is the wrong length.");
}
//Luhn check
var c;
var digitOne;
var digitTwo;
var numSum;
for(i=0;i<16;i+2){
c = creditNum.slice(i,i+1);
if(c.length==2){
digitOne = c.slice(0,1);
digitTwo = c.slice(1,2);
numSum = numSum + (digitOne + digitTwo);
}else{
numSum = numSum + c;
}
}
if((numSum%10)!=0){
alert("Invalid Number!");
}else{
alert("Credit Card Accepted!");
}
</script>发布于 2013-10-08 14:01:32
代码中最直接的问题是for循环。i+2不是一个合适的第三届任期。从上下文中,您正在寻找i = i + 2,您可以以i += 2的形式编写它。
看起来你的算法是“取16位数字,把它们转换成8对,加在一起,看看和是否可以被10整除”。如果是这样的话,你可以大大简化你的循环--你永远不需要看十元的位置,仅仅是单位的位置。
您的循环可以像这样做同样的事情:
for (i = 1; i < 16; i +=2) {
numSum += +creditNum[i];
}另外,请注意,只要处理字符串,就不需要分割任何东西--只需使用数组表示法来获取每个字符。
我在+前面添加了一个creditNum。javascript的一个问题是,它将字符串视为字符串,因此,如果您有字符串"1“和字符串"3”并将它们相加,您将连接起来,得到"13“而不是4。加号强制字符串是一个数字,因此您将得到正确的结果。
循环的第三个术语是我看到的唯一明显的错误。我实际上不知道Luhn算法,所以从代码的上下文中推断出其余的算法。
编辑
好吧,如果你发布了Luhn算法是什么会有帮助的。机会是,如果你至少能表达出来,你可以帮助我们帮助你编码它。
这是你想要的。
// Luhn check
function luhnCheck(sixteenDigitString) {
var numSum = 0;
var value;
for (var i = 0; i < 16; ++i) {
if (i % 2 == 0) {
value = 2 * sixteenDigitString[i];
if (value >= 10) {
value = (Math.floor(value / 10) + value % 10);
}
} else {
value = +sixteenDigitString[i];
}
numSum += value;
}
return (numSum % 10 == 0);
}
alert(luhnCheck("4111111111111111"));这是通过所有的数字,保持偶数指数,但增加了一倍的奇数。如果双倍大于9,按照维基百科中的算法,两位数的值相加在一起。
小提琴
注意:我测试的号码不是我的信用卡号码,但这是一个众所周知的数字,你可以使用它通过正确编码的Luhn验证。
发布于 2019-02-04 05:22:11
我下面的解决方案也将在AmEx上工作。不久前我提交了一份代码测试报告。希望它有帮助:)
function validateCard(num){
var oddSum = 0;
var evenSum = 0;
var numToString = num.toString().split("");
for(var i = 0; i < numToString.length; i++){
if(i % 2 === 0){
if(numToString[i] * 2 >= 10){
evenSum += ((numToString[i] * 2) - 9 );
} else {
evenSum += numToString[i] * 2;
}
} else {
oddSum += parseInt(numToString[i]);
}
}
return (oddSum + evenSum) % 10 === 0;
}
console.log(validateCard(41111111111111111));享受-来自https://spangle.com.au的米奇
发布于 2021-06-23 20:36:00
@Spangle,当您在这里使用偶数和奇数时,您已经在考虑索引0是偶数了吗?所以你把索引0,2等的数字加倍,而不是第二位,第四位,等等。这是故意的吗?与我正在使用的另一种算法相比,它返回了一些卡片的不一致验证。例如,美国运通的378282246310005。
https://stackoverflow.com/questions/19249554
复制相似问题