1.判斷銀行卡號(hào)
檢驗(yàn)數(shù)字算法(Luhn Check Digit Algorithm),也叫做模數(shù)10公式,是一種簡(jiǎn)單的算法,用于驗(yàn)證銀行卡、信用卡號(hào)碼的有效性的算法。對(duì)所有大型信用卡公司發(fā)行的信用卡都起作用,
這些公司包括美國(guó)Express、護(hù)照、萬事達(dá)卡、Discover和用餐者俱樂部等。這種算法最初是在20世紀(jì)60年代由一組數(shù)學(xué)家制定,現(xiàn)在Luhn檢驗(yàn)數(shù)字算法屬于大眾,任何人都可以使用它。
算法:將每個(gè)奇數(shù)加倍和使它變?yōu)閱蝹€(gè)的數(shù)字,如果必要的話通過減去9和在每個(gè)偶數(shù)上加上這些值。如果此卡要有效,那么,結(jié)果必須是10的倍數(shù)。
// 判斷銀行卡
+ (BOOL) validateBankCardNumber: (NSString *)bankCardNumber
{
NSString *digitsOnly = bankCardNumber;
int sum = 0;
int digit = 0;
int addend = 0;
BOOL timesTwo = false;
for (NSInteger i = digitsOnly.length - 1; i >= 0; i--) {
digit = [digitsOnly characterAtIndex:i] - '0';
if (timesTwo) { addend = digit * 2; if (addend > 9) {
addend -= 9;
}
} else {
addend = digit;
}
sum += addend;
timesTwo = !timesTwo;
}
int modulus = sum % 10;
return modulus == 0;
return YES;
}
2.textfield銀行卡四位輸入
NSString *text = [self.cardText text];
NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\b"];
string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
[self popViewText:@"請(qǐng)輸入數(shù)字" textField:_cardText];
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]];
// 限制長(zhǎng)度
if (newString.length >= 24) {
return NO;
}
[self.cardText setText:newString];
return NO;
}
return YES;
3.返回去掉空格的字符串
-(NSString *)bankNumToNormalNum
{
return [self.cardText.text stringByReplacingOccurrencesOfString:@" " withString:@""];
}
4.調(diào)用
_cardNumber = [self bankNumToNormalNum];
BOOL isCard = [CheckMessage validateBankCardNumber:_cardNumber];
if (isCard) {
NSLog(@"1");
NSLog(@"%@, %@", _cardText.text, _cardNumber);