Java基于Luhn算法实现银行卡卡号格式校验详解

 更新时间:2026年01月05日 08:27:23   作者:牛肉胡辣汤  
在金融行业,特别是涉及到银行卡处理的场景中,确保银行卡号的有效性是至关重要的,本文将详细介绍如何使用Java实现基于Luhn算法的银行卡卡号格式校验,有需要的可以了解下

引言

在金融行业,特别是涉及到银行卡处理的场景中,确保银行卡号的有效性是至关重要的。Luhn算法(也称为“模10算法”)是一种简单的校验和算法,用于验证各种识别码,如信用卡号、IMSI号等。本文将详细介绍如何使用Java实现基于Luhn算法的银行卡卡号格式校验。

Luhn算法原理

Luhn算法的基本步骤如下:

从右向左对卡号进行编号,最右边的数字是第1位。

双倍处理所有奇数位置的数字(即第1位、第3位、第5位等),如果结果大于9,则减去9。

求和所有数字。

检查和:如果总和能够被10整除,则卡号有效;否则无效。

Java实现

1. 定义方法

首先,我们需要定义一个方法来实现Luhn算法的校验逻辑。

public class LuhnValidator {

    /**
     * 校验银行卡号是否有效
     *
     * @param cardNumber 银行卡号
     * @return 卡号是否有效
     */
    public static boolean isValidCardNumber(String cardNumber) {
        if (cardNumber == null || !cardNumber.matches("\\d+")) {
            return false;
        }

        int sum = 0;
        boolean isSecond = false;

        for (int i = cardNumber.length() - 1; i >= 0; i--) {
            int digit = cardNumber.charAt(i) - '0';

            if (isSecond) {
                digit *= 2;
            }

            sum += digit > 9 ? digit - 9 : digit;
            isSecond = !isSecond;
        }

        return sum % 10 == 0;
    }
}

2. 测试方法

为了确保我们的实现是正确的,我们可以编写一些测试用例来验证方法的正确性。

public class LuhnValidatorTest {

    public static void main(String[] args) {
        String[] testNumbers = {
            "4111111111111111", // Visa, valid
            "4111111111111112", // Visa, invalid
            "5500000000000004", // MasterCard, valid
            "5500000000000000", // MasterCard, invalid
            "6011000000000004", // Discover, valid
            "6011000000000000", // Discover, invalid
            "378282246310005",  // American Express, valid
            "378282246310006"   // American Express, invalid
        };

        for (String number : testNumbers) {
            System.out.println("Card Number: " + number + " is " + (LuhnValidator.isValidCardNumber(number) ? "valid" : "invalid"));
        }
    }
}

3. 运行测试

运行上述测试代码,输出结果如下:

Card Number: 4111111111111111 is valid
Card Number: 4111111111111112 is invalid
Card Number: 5500000000000004 is valid
Card Number: 5500000000000000 is invalid
Card Number: 6011000000000004 is valid
Card Number: 6011000000000000 is invalid
Card Number: 378282246310005 is valid
Card Number: 378282246310006 is invalid

方法补充

Luhn算法(也称为模10算法)是一种简单的校验和算法,常用于验证各种识别号码,如信用卡号。以下是一个Java示例代码,展示了如何使用Luhn算法来校验银行卡号的格式。

Java 示例代码

public class LuhnAlgorithm {

    /**
     * 检查给定的卡号是否通过Luhn算法校验。
     *
     * @param cardNumber 卡号字符串
     * @return 如果卡号通过校验则返回true,否则返回false
     */
    public static boolean isValidCardNumber(String cardNumber) {
        if (cardNumber == null || !cardNumber.matches("\\d+")) {
            return false;
        }

        int sum = 0;
        boolean isSecond = false;

        for (int i = cardNumber.length() - 1; i >= 0; i--) {
            int digit = cardNumber.charAt(i) - '0';

            if (isSecond) {
                digit *= 2;
            }

            sum += digit / 10;
            sum += digit % 10;

            isSecond = !isSecond;
        }

        return (sum % 10 == 0);
    }

    public static void main(String[] args) {
        String cardNumber1 = "4111111111111111"; // 测试有效的Visa卡号
        String cardNumber2 = "6011000990139424"; // 测试有效的Discover卡号
        String cardNumber3 = "1234567890123456"; // 测试无效的卡号

        System.out.println("Card Number: " + cardNumber1 + " is valid: " + isValidCardNumber(cardNumber1));
        System.out.println("Card Number: " + cardNumber2 + " is valid: " + isValidCardNumber(cardNumber2));
        System.out.println("Card Number: " + cardNumber3 + " is valid: " + isValidCardNumber(cardNumber3));
    }
}

代码解释

输入验证:首先检查输入的卡号是否为非空且只包含数字。如果不是,则直接返回​​false​​。

Luhn算法实现

  • 从卡号的最后一个数字开始,向前遍历每个数字。
  • 对于每第二个数字(从右向左数),将其乘以2。
  • 如果乘以2后的结果大于9,则将其拆分为两个数字并相加(例如,8 * 2 = 16,1 + 6 = 7)。
  • 将所有处理后的数字相加,得到总和。

校验:如果总和能被10整除,则卡号通过Luhn算法校验,返回​​true​​;否则返回​​false​​。

测试

在​​main​​方法中,我们测试了三个不同的卡号:

  • ​4111111111111111​​:一个有效的Visa卡号。
  • ​6011000990139424​​:一个有效的Discover卡号。
  • ​1234567890123456​​:一个无效的卡号。

运行程序后,输出结果将显示每个卡号是否通过Luhn算法校验。

Luhn算法(也称为模10算法)是一种简单的校验和算法,用于验证各种识别号码,如信用卡号码。该算法通过一个特定的公式来计算校验位,以确保号码的有效性。

下面是一个使用Java实现的Luhn算法示例,用于验证银行卡卡号是否有效:

Java代码实现

public class LuhnAlgorithm {

    /**
     * 验证卡号是否有效
     *
     * @param cardNumber 卡号字符串
     * @return 如果卡号有效返回true,否则返回false
     */
    public static boolean isValid(String cardNumber) {
        if (cardNumber == null || !cardNumber.matches("\\d+")) {
            return false;
        }

        int sum = 0;
        boolean isSecond = false;

        for (int i = cardNumber.length() - 1; i >= 0; i--) {
            int digit = cardNumber.charAt(i) - '0';

            if (isSecond) {
                digit *= 2;
            }

            sum += digit > 9 ? digit - 9 : digit;
            isSecond = !isSecond;
        }

        return sum % 10 == 0;
    }

    public static void main(String[] args) {
        String cardNumber = "4111111111111111"; // 测试卡号
        boolean isValid = isValid(cardNumber);
        System.out.println("Card number " + cardNumber + " is " + (isValid ? "valid" : "invalid"));
    }
}

代码解释

1.输入验证​if (cardNumber == null || !cardNumber.matches("\\d+"))​​:首先检查输入的卡号是否为非空且只包含数字。

2.初始化变量

  • ​int sum = 0​​:用于存储所有数字的总和。
  • ​boolean isSecond = false​​:用于标记当前处理的数字是否是偶数位置的数字(从右向左计数)。

3.遍历卡号

  • ​for (int i = cardNumber.length() - 1; i >= 0; i--)​​:从卡号的最后一个字符开始向前遍历。
  • ​int digit = cardNumber.charAt(i) - '0'​​:将当前字符转换为整数。
  • ​if (isSecond)​​:如果当前数字是偶数位置的数字,则将其乘以2。
  • ​sum += digit > 9 ? digit - 9 : digit​​:如果乘以2后的数字大于9,则减去9后再加到总和中,否则直接加到总和中。
  • ​isSecond = !isSecond​​:切换​​isSecond​​标志,以便下一次处理奇数位置的数字。

4.校验结果:​​return sum % 10 == 0​​:如果总和能被10整除,则卡号有效,否则无效。

5.测试

  • ​String cardNumber = "4111111111111111"​​:测试卡号。
  • ​boolean isValid = isValid(cardNumber)​​:调用​​isValid​​方法验证卡号。
  • ​System.out.println("Card number " + cardNumber + " is " + (isValid ? "valid" : "invalid"))​​:输出验证结果。

这个实现简单明了,适用于大多数需要验证银行卡号有效性的场景。

到此这篇关于Java基于Luhn算法实现银行卡卡号格式校验详解的文章就介绍到这了,更多相关Java银行卡卡号格式校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis以main方法形式调用dao层执行代码实例

    Mybatis以main方法形式调用dao层执行代码实例

    这篇文章主要介绍了Mybatis以main方法形式调用dao层执行代码实例,MyBatis 是一款优秀的持久层框架,MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,需要的朋友可以参考下
    2023-08-08
  • 利用Java搭建个简单的Netty通信实例教程

    利用Java搭建个简单的Netty通信实例教程

    这篇文章主要给大家介绍了关于如何利用Java搭建个简单的Netty通信,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • SpringBoot整合Apache Spark实现一个简单的数据分析功能

    SpringBoot整合Apache Spark实现一个简单的数据分析功能

    ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务,下面我们就来看看SpringBoot如何整合Apache Spark实现一个简单的数据分析功能吧
    2025-11-11
  • mybatis教程之延迟加载详解

    mybatis教程之延迟加载详解

    本篇文章主要介绍了mybatis教程之延迟加载详解。详细介绍了延迟加载的意义和用法实现,有兴趣的可以了解一下
    2017-05-05
  • IDEA实现JDBC的操作步骤

    IDEA实现JDBC的操作步骤

    JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,本文给大家介绍IDEA实现JDBC的操作步骤,感兴趣的朋友一起看看吧
    2022-01-01
  • 几道java循环练习题(适合新人)

    几道java循环练习题(适合新人)

    这篇文章主要给大家介绍了几道java循环练习题,非常适合刚入门的java新人,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 解决使用redisTemplate高并发下连接池满的问题

    解决使用redisTemplate高并发下连接池满的问题

    这篇文章主要介绍了解决使用redisTemplate高并发下连接池满的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java Mail与Apache Mail发送邮件示例

    Java Mail与Apache Mail发送邮件示例

    这篇文章主要介绍了Java Mail与Apache Mail发送邮件示例的相关资料,需要的朋友可以参考下
    2014-10-10
  • Java中的springboot监听事件和处理事件详解

    Java中的springboot监听事件和处理事件详解

    这篇文章主要介绍了Java中的springboot监听事件和处理事件,这个示例展示了如何在Spring Boot应用中定义自定义事件、发布事件以及监听事件,需要的朋友可以参考下
    2024-07-07
  • 在SpringBoot中使用JWT的实现方法

    在SpringBoot中使用JWT的实现方法

    这篇文章主要介绍了在SpringBoot中使用JWT的实现方法,详细的介绍了什么是JWT和JWT实战,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12

最新评论