Java基于Luhn算法實現(xiàn)銀行卡卡號格式校驗詳解
引言
在金融行業(yè),特別是涉及到銀行卡處理的場景中,確保銀行卡號的有效性是至關(guān)重要的。Luhn算法(也稱為“模10算法”)是一種簡單的校驗和算法,用于驗證各種識別碼,如信用卡號、IMSI號等。本文將詳細(xì)介紹如何使用Java實現(xiàn)基于Luhn算法的銀行卡卡號格式校驗。
Luhn算法原理
Luhn算法的基本步驟如下:
從右向左對卡號進(jìn)行編號,最右邊的數(shù)字是第1位。
雙倍處理所有奇數(shù)位置的數(shù)字(即第1位、第3位、第5位等),如果結(jié)果大于9,則減去9。
求和所有數(shù)字。
檢查和:如果總和能夠被10整除,則卡號有效;否則無效。

Java實現(xiàn)
1. 定義方法
首先,我們需要定義一個方法來實現(xiàn)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. 測試方法
為了確保我們的實現(xiàn)是正確的,我們可以編寫一些測試用例來驗證方法的正確性。
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. 運行測試
運行上述測試代碼,輸出結(jié)果如下:
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
方法補(bǔ)充
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));
}
}代碼解釋
輸入驗證:首先檢查輸入的卡號是否為非空且只包含數(shù)字。如果不是,則直接返回??false??。
Luhn算法實現(xiàn):
- 從卡號的最后一個數(shù)字開始,向前遍歷每個數(shù)字。
- 對于每第二個數(shù)字(從右向左數(shù)),將其乘以2。
- 如果乘以2后的結(jié)果大于9,則將其拆分為兩個數(shù)字并相加(例如,8 * 2 = 16,1 + 6 = 7)。
- 將所有處理后的數(shù)字相加,得到總和。
校驗:如果總和能被10整除,則卡號通過Luhn算法校驗,返回??true??;否則返回??false??。
測試
在??main??方法中,我們測試了三個不同的卡號:
- ?
?4111111111111111??:一個有效的Visa卡號。 - ?
?6011000990139424??:一個有效的Discover卡號。 - ?
?1234567890123456??:一個無效的卡號。
運行程序后,輸出結(jié)果將顯示每個卡號是否通過Luhn算法校驗。
Luhn算法(也稱為模10算法)是一種簡單的校驗和算法,用于驗證各種識別號碼,如信用卡號碼。該算法通過一個特定的公式來計算校驗位,以確保號碼的有效性。
下面是一個使用Java實現(xiàn)的Luhn算法示例,用于驗證銀行卡卡號是否有效:
Java代碼實現(xiàn)
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+"))??:首先檢查輸入的卡號是否為非空且只包含數(shù)字。
2.初始化變量:
- ?
?int sum = 0??:用于存儲所有數(shù)字的總和。 - ?
?boolean isSecond = false??:用于標(biāo)記當(dāng)前處理的數(shù)字是否是偶數(shù)位置的數(shù)字(從右向左計數(shù))。
3.遍歷卡號:
- ?
?for (int i = cardNumber.length() - 1; i >= 0; i--)??:從卡號的最后一個字符開始向前遍歷。 - ?
?int digit = cardNumber.charAt(i) - '0'??:將當(dāng)前字符轉(zhuǎn)換為整數(shù)。 - ?
?if (isSecond)??:如果當(dāng)前數(shù)字是偶數(shù)位置的數(shù)字,則將其乘以2。 - ?
?sum += digit > 9 ? digit - 9 : digit??:如果乘以2后的數(shù)字大于9,則減去9后再加到總和中,否則直接加到總和中。 - ?
?isSecond = !isSecond??:切換??isSecond??標(biāo)志,以便下一次處理奇數(shù)位置的數(shù)字。
4.校驗結(jié)果:??return sum % 10 == 0??:如果總和能被10整除,則卡號有效,否則無效。
5.測試:
- ?
?String cardNumber = "4111111111111111"??:測試卡號。 - ?
?boolean isValid = isValid(cardNumber)??:調(diào)用??isValid??方法驗證卡號。 - ?
?System.out.println("Card number " + cardNumber + " is " + (isValid ? "valid" : "invalid"))??:輸出驗證結(jié)果。
這個實現(xiàn)簡單明了,適用于大多數(shù)需要驗證銀行卡號有效性的場景。
到此這篇關(guān)于Java基于Luhn算法實現(xiàn)銀行卡卡號格式校驗詳解的文章就介紹到這了,更多相關(guān)Java銀行卡卡號格式校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot之SpringApplication 事件監(jiān)聽
這篇文章主要介紹了spring boot之SpringApplication 事件監(jiān)聽,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
springboot項目中jackson-序列化-處理 NULL教程
這篇文章主要介紹了springboot項目中jackson-序列化-處理 NULL教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Java的RocketMq水平擴(kuò)展及負(fù)載均衡詳解
這篇文章主要介紹了Java的RocketMq水平擴(kuò)展及負(fù)載均衡詳解,RocketMQ是一個分布式具有高度可擴(kuò)展性的消息中間件,本文旨在探索在broker端,生產(chǎn)端,以及消費端是如何做到橫向擴(kuò)展以及負(fù)載均衡的,需要的朋友可以參考下2024-01-01
SpringBoot對不同Bean注解的區(qū)別和使用場景說明
這篇文章主要介紹了SpringBoot對不同Bean注解的區(qū)別和使用場景說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Spring?Boot?結(jié)合?WxJava?實現(xiàn)文章上傳微信公眾號草稿箱與群發(fā)
本文將詳細(xì)介紹如何使用SpringBoot框架結(jié)合WxJava開發(fā)工具包,實現(xiàn)文章上傳到微信公眾號草稿箱以及群發(fā)功能,感興趣的朋友一起看看吧2025-07-07
SpringBoot使用Atomikos技術(shù)整合多數(shù)據(jù)源的實現(xiàn)
這篇文章主要介紹了SpringBoot使用Atomikos技術(shù)整合多數(shù)據(jù)源的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
為什么在foreach循環(huán)中JAVA集合不能添加或刪除元素
今天給大家?guī)淼奈恼率顷P(guān)于Java的相關(guān)知識,文章圍繞著為什么在foreach循環(huán)中JAVA集合不能添加或刪除元素展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06

