首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Luhn检查Javascript

Luhn检查Javascript
EN

Stack Overflow用户
提问于 2019-11-08 13:23:48
回答 1查看 297关注 0票数 1

我正在尝试让某人输入那里的信用卡号码,并通过做Luhn检查来验证它是否是有效的号码。我希望能够检查它,如果他们输入整个卡号作为一个大字符串或如果他们在其中放空格。但是,在我的函数validate中,我一直收到一条错误消息,指出我的total变量有一个非法的return语句。这是我当前的代码。

代码语言:javascript
复制
    <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>
EN

回答 1

Stack Overflow用户

发布于 2019-11-08 13:32:46

您的函数validate在for循环后缺少左大括号。这使得您的return语句位于函数外部,并且由于return语句在函数外部是无效的,因此它是一个无效的return语句。

代码语言:javascript
复制
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的扩展。它将在一起突出显示成对的括号。这将帮助您进行格式设置。

代码语言: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.");
    }
}

这些都是更改后的代码行(左边是新代码,右边是旧代码):

完成提示

验证函数

所以,目前如果你验证你的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。如下所示:

代码语言:javascript
复制
var sum = 0;
var sum1 = 0;
var total = 0;

您的validate函数唯一的另一个错误是检查是否为numbers.length%2==0,而您应该检查是否为i%2==0。您可能需要考虑一下原因,但是有一件事您可能会注意到,在循环的迭代过程中,numbers的长度永远不会改变,因为i在每一步都会改变。

cardnumber函数

您的out变量需要初始化为零。你的卡号可以用空格拆分,然后用空字符串连接。如果用户不小心键入了多个空格,则会处理此问题。然后,由于加入了拆分数组,您将不再需要for循环。

代码语言:javascript
复制
var numbers = cardnumber.split(" ").join('');
var out =0;

out += validate(numbers);

需要以某种方式改变的线条

这是旧代码的不同之处,其中有不正确的地方,需要以某种方式更改。我不会给你完整的代码,但希望这足以帮助你自己弄清楚剩下的部分(出于某种程度的学术诚信,我觉得我不应该给你所有的解决方案。如果我至少不让你自己思考和输入,我会觉得我剥夺了你学习更多东西的机会。)如果你想知道在红色突出显示的特定行上需要更改什么,那么所有这些都应该在上面,所以祝你好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58760847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档