我正在尝试让某人输入那里的信用卡号码,并通过做Luhn检查来验证它是否是有效的号码。我希望能够检查它,如果他们输入整个卡号作为一个大字符串或如果他们在其中放空格。但是,在我的函数validate中,我一直收到一条错误消息,指出我的total变量有一个非法的return语句。这是我当前的代码。
<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>发布于 2019-11-08 13:32:46
您的函数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.");
}
}这些都是更改后的代码行(左边是新代码,右边是旧代码):

完成提示
验证函数
所以,目前如果你验证你的numbers是字符串,当它们传递到验证函数中时。当它们被发送到validate中时,这是很好的,但是当您在索引i处添加numbers (即numbers[i])时,您应该使用parseInt(numbers[i], 10)将它们转换为数字,因此例如sum += parseInt(numbers[i], 10);在添加到sum1时也是如此。另一件需要注意的事情是,说var sum会使sum等于undefined的值。当您将一个数字或字符串添加到一个未定义的值时,可能会发生一些意想不到的事情,因此,由于您需要将sums和totals设置为数字,因此您应该将sums和totals初始化为0。如下所示:
var sum = 0;
var sum1 = 0;
var total = 0;您的validate函数唯一的另一个错误是检查是否为numbers.length%2==0,而您应该检查是否为i%2==0。您可能需要考虑一下原因,但是有一件事您可能会注意到,在循环的迭代过程中,numbers的长度永远不会改变,因为i在每一步都会改变。
cardnumber函数
您的out变量需要初始化为零。你的卡号可以用空格拆分,然后用空字符串连接。如果用户不小心键入了多个空格,则会处理此问题。然后,由于加入了拆分数组,您将不再需要for循环。
var numbers = cardnumber.split(" ").join('');
var out =0;
out += validate(numbers);需要以某种方式改变的线条
这是旧代码的不同之处,其中有不正确的地方,需要以某种方式更改。我不会给你完整的代码,但希望这足以帮助你自己弄清楚剩下的部分(出于某种程度的学术诚信,我觉得我不应该给你所有的解决方案。如果我至少不让你自己思考和输入,我会觉得我剥夺了你学习更多东西的机会。)如果你想知道在红色突出显示的特定行上需要更改什么,那么所有这些都应该在上面,所以祝你好运。

https://stackoverflow.com/questions/58760847
复制相似问题