我刚刚开始学习,我对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>
答案 0 :(得分:0)
代码中的直接问题是您的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 algorithm的内容,那会有所帮助。如果您至少可以清楚地表达出来,那么您可以帮助我们帮助您编写代码。
这就是你想要的。
// 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验证。
答案 1 :(得分:0)
我下面的解决方案也可以在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的Mitch
答案 2 :(得分:0)
@Spangle,当你在这里使用偶数和奇数时,你已经在考虑索引 0 是偶数了吗?因此,您将索引 0、2 等处的数字加倍,而不是将第二个位置、第四个等处的数字加倍。这是故意的吗?与我正在使用的另一种算法相比,它返回的某些卡片的验证不一致。试试例如美国运通的 378282246310005。