Lou*_*uie 7 iphone iphone-sdk-3.0
//////////// 更新! //////////////////
所以我在找到一些公式和测试之后在网上四处看看.我发现了一个有效的公式.1.反转卡号2.对于每隔一个数字加倍数字3.对于没有加倍的数字,将它们添加到新的"加倍"字符串中4.将所有数字加在一起 - 一个一个5.除以十,如果没有余数,卡号有效 - 可能不会被"批准",但数字至少是正确的顺序.
例如,取卡号"4866 3060 7833 1744"
以下是http://www.brainjar.com/js/validation/default2.asp的来源
因为我爱你们所有人,而且你们在很多方面都帮助过我,我想我会分享我为了这个公式而共同编写的代码.再次感谢Mike Crandall,他帮助我扭转了第一根弦,我从那里拿走了它.
这是使用Luhn公式
我的.h文件
#import <UIKit/UIKit.h>
@interface CCValidatorViewController : UIViewController {
NSString * ccNumber;
NSString * validCard;
NSString * isAMEX;
}
@property (nonatomic, retain)NSString * ccNumber;
@property (nonatomic, retain)NSString * isAMEX;
@property (nonatomic, retain)NSString * validCard;
- (NSString *) validateCard:(NSString *)ccNumberString;
@end
Run Code Online (Sandbox Code Playgroud)
我的.m文件
- (void)viewDidLoad {
[super viewDidLoad];
ccNumber = @"4866306078331744"; //invalid card number
ccNumber = [self validateCard:ccNumber];
NSLog(@"%@",validCard);
}
- (NSString *) validateCard:(NSString *)ccNumberString{
validCard = @"";
NSString * ccNumberReversed = @"";
NSString * doubleNumbers = @"";
NSString * everyOtherNumber = @"";
NSString * lastChar = @"";
NSString * intDoubled;
NSString * stringToSum;
NSUInteger count = [ccNumberString length];
NSUInteger len = 1;
NSRange r;
//since American Express is American Express....., we have to do something special for them.... assholes....
r = NSMakeRange( 0, 1);
lastChar = [ccNumberString substringWithRange:r];
if ([lastChar compare:@"3"] ==0) {
isAMEX = @"YES";
}
else {
isAMEX = @"NO";
}
//reverse the string
for ( int i=0; i<count; i++){
r = NSMakeRange( count-i-1, len);
lastChar = [ccNumberString substringWithRange:r];
ccNumberReversed = [ccNumberReversed stringByAppendingString:lastChar];
}
//double every other number
int loc = 1;
int ttr = ccNumberReversed.length/2;
for ( int i=0; i<ttr; i++){
r = NSMakeRange( loc, len);
loc = loc+2;
lastChar = [ccNumberReversed substringWithRange:r];
int dv = [lastChar intValue];
dv = (dv * 2);
intDoubled = [NSString stringWithFormat:@"%d",dv];
doubleNumbers = [doubleNumbers stringByAppendingString:intDoubled];
}
// get every other number starting at index 0
loc = 0;
if ([isAMEX compare:@"YES"] ==0) {
ttr = ccNumber.length/2+1;
}
else {
ttr = ccNumber.length/2;
}
for ( int i=0; i<ttr; i++){
r = NSMakeRange( loc, len);
loc = loc+2;
lastChar = [ccNumberReversed substringWithRange:r];
everyOtherNumber = [everyOtherNumber stringByAppendingString:lastChar];
}
//combine both strings so we can sum them up
stringToSum = [doubleNumbers stringByAppendingString:everyOtherNumber];
// add all the numbers up one by one and divide by 10... if no remainder - its a valid card
loc = 0;
ttr = stringToSum.length;
int stringSum = 0;
for ( int i=0; i<ttr; i++){
r = NSMakeRange( loc, len);
lastChar = [stringToSum substringWithRange:r];
int cc = [lastChar intValue];
stringSum = stringSum+cc;
loc ++;
}
if (stringSum%10 == 0) {
validCard = @"YES";
}
else {
validCard = @"NO";
}
return validCard;
}
Run Code Online (Sandbox Code Playgroud)
**********原帖*******************
在发布到API之前,是否有人可以共享任何可以验证信用卡号的代码?
我问,如果我在我的应用程序中销售电影院的门票,苹果会不会有任何问题?
这个应用程序非常类似于fandango,但对于私人连锁影院(总共约13个).
提前致谢!