javascript - Luhn 检查 Javascript

标签 javascript html css

我试图让某人输入信用卡号并通过 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.");
    }
}

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

enter image description here

完成提示

验证函数

因此,目前如果您使用 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);

需要以某种方式改变的行

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

enter image description here

关于javascript - Luhn 检查 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58760847/

相关文章:

javascript - 我怎样才能让这个翻滚动画的一部分连续循环?

javascript - 接受 IE8 文件输入中的属性

java - 如何从 HTML 网站中提取数据?

html - 没有额外 'divs' 的 CSS 布局

css - 为什么在查看源代码时外部样式表显示为内联?

php - date() 类向我的日期格式添加换行符

html - 简单的CSS高度

javascript - 用javascript替换正则表达式中的部分文本

javascript - Chrome 扩展程序安装

javascript - 使用 Express 和 EmailJS 发送电子邮件