判斷用戶輸入的銀行卡號(hào)是否正確的方法(基于Luhn算法的格式校驗(yàn))
開(kāi)發(fā)中,有時(shí)候,為了打造更好的用戶體驗(yàn),同時(shí)減輕服務(wù)器端的壓力,需要對(duì)于一些如,手機(jī)號(hào)碼,銀行卡號(hào),身份證號(hào)碼進(jìn)行格式校驗(yàn)
下面是判斷銀行卡號(hào)輸入是否正確的代碼(基于Luhn算法的格式校驗(yàn)):
iOS代碼:
/** * 銀行卡格式校驗(yàn) * * @param cardNo 銀行卡號(hào) * * @return */ + (BOOL) checkCardNo:(NSString*) cardNo{ int oddsum = 0; //奇數(shù)求和 int evensum = 0; //偶數(shù)求和 int allsum = 0; int cardNoLength = (int)[cardNo length]; int lastNum = [[cardNo substringFromIndex:cardNoLength-1] intValue]; cardNo = [cardNo substringToIndex:cardNoLength - 1]; for (int i = cardNoLength -1 ; i>=1;i--) { NSString *tmpString = [cardNo substringWithRange:NSMakeRange(i-1, 1)]; int tmpVal = [tmpString intValue]; if (cardNoLength % 2 ==1 ) { if((i % 2) == 0){ tmpVal *= 2; if(tmpVal>=10) tmpVal -= 9; evensum += tmpVal; }else{ oddsum += tmpVal; } }else{ if((i % 2) == 1){ tmpVal *= 2; if(tmpVal>=10) tmpVal -= 9; evensum += tmpVal; }else{ oddsum += tmpVal; } } } allsum = oddsum + evensum; allsum += lastNum; if((allsum % 10) == 0) return YES; else return NO; }
Androd代碼:
/** * 匹配Luhn算法:可用于檢測(cè)銀行卡卡號(hào) * @param cardNo * @return */ public static boolean matchLuhn(String cardNo) { int[] cardNoArr = new int[cardNo.length()]; for (int i=0; i<cardNo.length(); i++) { cardNoArr[i] = Integer.valueOf(String.valueOf(cardNo.charAt(i))); } for(int i=cardNoArr.length-2;i>=0;i-=2) { cardNoArr[i] <<= 1; cardNoArr[i] = cardNoArr[i]/10 + cardNoArr[i]%10; } int sum = 0; for(int i=0;i<cardNoArr.length;i++) { sum += cardNoArr[i]; } return sum % 10 == 0; }
附(銀行卡號(hào)格式化):
在輸入銀行卡號(hào)過(guò)程中,通常,我們會(huì)每隔4位插入一個(gè)"-",類似"1332-2131-2313-1231-212"這種的格式
可以通過(guò)以下方法實(shí)現(xiàn):
設(shè)置textField的代理
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *text = [textField text]; NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\b"]; string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""]; if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) { return NO; } text = [text stringByReplacingCharactersInRange:range withString:string]; text = [text stringByReplacingOccurrencesOfString:@"-" withString:@""]; NSString *newString = @""; while (text.length > 0) { NSString *subString = [text substringToIndex:MIN(text.length, 4)]; newString = [newString stringByAppendingString:subString]; if (subString.length == 4) { newString = [newString stringByAppendingString:@"-"]; } text = [text substringFromIndex:MIN(text.length, 4)]; } newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]]; if (newString.length >= 24) { return NO; } [textField setText:newString]; return NO; }
最后,怎么獲得不包含符號(hào)"-"的銀行卡號(hào)呢?
[self.textField.text stringByReplacingOccurrencesOfString:@"-" withString:@""]
以上這篇判斷用戶輸入的銀行卡號(hào)是否正確的方法(基于Luhn算法的格式校驗(yàn))就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
[js]用JAVASCRIPT正則表達(dá)式限制文本字節(jié)數(shù)的代碼
[js]用JAVASCRIPT正則表達(dá)式限制文本字節(jié)數(shù)的代碼...2007-11-11coolcode轉(zhuǎn)SyntaxHighlighter與Mysql正則表達(dá)式實(shí)現(xiàn)分析
blog的代碼高亮插件原來(lái)是coolcode的,coolcode的高亮插件確實(shí)很酷,顯示效果也很棒,但是占用的位子太大了。2011-04-04asp去掉html,保留img br p div的正則實(shí)現(xiàn)代碼
非常實(shí)用的一個(gè)函數(shù),這里主要用到了正則的匹配模式大家可以看腳本之家網(wǎng)站的正則專題2009-02-02Hive中常用正則表達(dá)式的運(yùn)用小結(jié)
在實(shí)際的應(yīng)用中,通常需要在一些復(fù)雜的、沒(méi)有規(guī)律的字符串中提取數(shù)據(jù),這時(shí)候就需要用到正則表達(dá)式了,這次講一下hive的正則表達(dá)式,感興趣的朋友跟隨小編一起看看吧2022-08-08JS正則表達(dá)式驗(yàn)證數(shù)字(非常全)
正則表達(dá)式,又稱規(guī)則表達(dá)式,在項(xiàng)目中經(jīng)常會(huì)用到正則表達(dá)式,今天小編抽空給大家分享js正則表達(dá)式驗(yàn)證數(shù)字的方法,感興趣的朋友參考下吧2016-12-12