我试图让某人输入信用卡号并通过 Luhn Check 验证它是否有效。我希望能够检查他们是否将整个卡号作为一个大字符串输入,或者是否在其中放置了空格。在我的函数验证中,尽管我不断收到一条错误消息,指出我的 total 变量存在非法返回语句。这是我当前的代码。
<script type="text/javascript">
function validate(numbers) {
var sum;
var sum1;
var total;
for (i = 0; i < numbers.length; i++) {
if (numbers.length % 2 == 0) {
sum += numbers[i];
}
else
if ((numbers[i] * 2) >= 10) {
sum1 += numbers[i] - 9;
}
else
sum1 += numbers[i];
}
total = sum + sum1;
return total;
}
function cardnumber() {
var cardnumber = document.getElementById("input").value;
var numbers = cardnumber.split(" ");
var out = "";
for (i = 0; i < numbers.length; i++) {
out += validate(numbers[i]);
if (out % 10 == 0)
return true;
}
}
function getOutput() {
if (cardnumber()) {
alert("You card is valid.");
}
}
</script>
<body>
<h1>I will validate a credit card number</h1>
Card Type:
<input type="radio" id="c1" value="Visa">Visa</input>
Card number: <textarea id="input" style="vertical-align: middle;"></textarea></br>
<input type="button" value="Submit" onclick="getOutput()" /></br></br>
</body>
最佳答案
您的函数 validate
在 for 循环后缺少左大括号。这使得您的 return 语句在您的函数之外,并且由于 return 语句在函数之外无效,因此它是无效的 return 语句。
function validate(numbers){
var sum;
var sum1;
var total;
for (i=0; i<numbers.length; i++) { // this previous curly brace `{` was missing
if (numbers.length%2==0){
sum += numbers[i];
}
else
if ((numbers[i]*2)>=10){
sum1 += numbers[i] -9;
}
else
sum1 +=numbers[i];
}
total = sum + sum1;
return total;
}
进行更多更正编辑:
函数的格式有很多错误,您还需要在其他 else
语句周围包含左花括号和右花括号。我建议获得像 VS Code 这样的代码编辑器并下载类似于 Bracket pair colorizer 2 的扩展程序.它将一起突出显示成对的括号。这将帮助您设置格式。
function validate(numbers){
var sum;
var sum1;
var total;
for (i=0; i<numbers.length; i++) {
if (numbers.length%2==0){
sum += numbers[i];
}
else {
if ((numbers[i] * 2) >= 10) {
sum1 += numbers[i] - 9;
}
else {
sum1 += numbers[i];
}
}
}
total = sum + sum1;
return total;
}
function cardnumber(){
var cardnumber= document.getElementById("input").value;
var numbers = cardnumber.split(" ");
var out ="";
for (i = 0; i < numbers.length; i++) {
out += validate(numbers[i]);
}
if (out %10==0)
return true;
}
function getOutput() {
if (cardnumber()) {
alert("You card is valid.");
}
}
这些是所有更改的行(左边是新代码,右边是旧代码):
完成提示
验证函数
因此,目前如果您使用 console.log,您的 numbers
在传递给验证函数时是字符串。当它们被发送到验证时这很好,但是当您在索引 i
处添加 numbers
(即 numbers[i]
)时,您应该使用parseInt(numbers[i], 10)
将它们变成数字,例如 sum += parseInt(numbers[i], 10);
添加时同样适用到 sum1
。另一件需要注意的事情是说 var sum
将使 sum
等于 undefined
值。当您将数字或字符串添加到未定义的值时,可能会发生一些意想不到的事情,因此由于您需要总和和总计为数字,因此您应该将总和和总计初始化为 0。像这样:
var sum = 0;
var sum1 = 0;
var total = 0;
validate
函数的唯一错误是您正在检查 numbers.length%2==0
而不是您应该检查 i%2==0
。您可能需要考虑一下为什么,但您可能会注意到的一件事是 numbers
的长度在循环迭代期间永远不会改变,而 i
会在每一步。
卡号函数
您的 out
变量需要初始化为零。您的卡号可以用空格分隔,然后用空字符串连接。如果用户不小心键入多个空格,这会处理。然后,由于您加入了拆分数组,因此您不再需要 for 循环。
var numbers = cardnumber.split(" ").join('');
var out =0;
out += validate(numbers);
需要以某种方式改变的行
这是旧代码行的不同之处,其中不正确并且需要以某种方式进行更改。我不会给你完整的代码,但希望这足以帮助你自己解决剩下的问题(我觉得由于某种程度的学术诚信,我不应该给你所有的解决方案。我会觉得如果我至少不让你自己思考并自己输入,我就剥夺了你学习更多的机会。)如果您想知道在以红色突出显示的特定行上需要更改什么,所有这些都应该在上方,祝您好运。
关于javascript - Luhn 检查 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58760847/