誰でもクレジットカード検証アルゴリズムのサンプルコードを共有できますか?iPhone SDKのクレジットカード検証アルゴリズム
答えて
お客様のアプリケーションでは、クレジットカード番号の確認のみを行うことができ、確認はできません(銀行が行う必要があります)。 これを参照するにはregular expression websiteを参照してください。
のLuhnアルゴリズム:ここで
http://en.wikipedia.org/wiki/Luhn_algorithm
一般的な言語のためのいくつかのサンプル:
http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers
このリンクからは、ほとんどのCCは、(表を参照)のLuhnを使用します。
http://en.wikipedia.org/wiki/Credit_card_number
(rosettacode)上記のリンクから:
- (NSMutableArray *) toCharArray {
NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[self length]];
for (int i=0; i < [self length]; i++) {
NSString *ichar = [NSString stringWithFormat:@"%c", [self characterAtIndex:i]];
[characters addObject:ichar];
}
return [characters autorelease];
}
+ (BOOL) luhnCheck:(NSString *)stringToTest {
NSMutableArray *stringAsChars = [stringToTest toCharArray];
BOOL isOdd = YES;
int oddSum = 0;
int evenSum = 0;
for (int i = [stringToTest length] - 1; i >= 0; i--) {
int digit = [(NSString *)[stringAsChars objectAtIndex:i] intValue];
if (isOdd)
oddSum += digit;
else
evenSum += digit/5 + (2*digit) % 10;
isOdd = !isOdd;
}
return ((oddSum + evenSum) % 10 == 0);
}
// results
BOOL test0 = [self luhnCheck:@"49927398716"]; //Result = YES
BOOL test1 = [self luhnCheck:@"49927398717"]; //Result = NO
BOOL test2 = [self luhnCheck:@"1234567812345678"]; //Result = NO
BOOL test3 = [self luhnCheck:@"1234567812345670"]; //Result = YES
これはIMEI番号の検証にも適しています。 –
それはうまく働いている。 – Raja
-(void)validation_check:(NSString*)pass_value
{
NSMutableArray *character;
unsigned long long odd_no;
unsigned long long new_odd_no;
unsigned long long even_no;
unsigned long long new_even_no;
unsigned long long multiplied_even_no;
unsigned long long changed_even_no;
unsigned long long final_value;
unsigned long long revers_card_no;
unsigned long long card_no;
unsigned long long check_reverse;
new_odd_no = 0;
new_even_no = 0;
card_no = [pass_value longLongValue];
character = [[NSMutableArray alloc]init];
//-------reversing order of entered card number---------
for(int i = 0; i<[pass_value length];i++)
{
check_reverse =(card_no % 10);
card_no = (card_no/10);
[character addObject:[NSString stringWithFormat:@"%qu",check_reverse]];
revers_card_no=revers_card_no*10+check_reverse;
check_reverse=card_no;
}
pass_value = [NSString stringWithFormat:@"%qu",revers_card_no];
//--------checking for even and odd numbers--------
for(int j=0;j<[character count];j++)
{
if(j % 2 == 0)
{
odd_no = [[character objectAtIndex:j]longLongValue];
new_odd_no = new_odd_no+odd_no;
}
else
{
//------doubling the value of even no's--------
even_no = [[character objectAtIndex:j]longLongValue];
multiplied_even_no=even_no*2;
NSLog(@"%qu",multiplied_even_no);
//-------if even is a single digit--------
if((multiplied_even_no % 10) == 0)
{
if(multiplied_even_no == 10)
{
new_even_no = 1+new_even_no;
}
else
{
new_even_no = multiplied_even_no + new_even_no;
}
}
//----------if there is multiple digits in even no---------
else
{
int x=(multiplied_even_no % 10);
int y=multiplied_even_no /10;
changed_even_no = x+y;
new_even_no = new_even_no + changed_even_no;
}
}
}
//--------calculating final value--------
final_value = new_even_no + new_odd_no;
NSLog(@"%qu",final_value);
if((final_value % 10) == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Card No is valid" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
card_textField.text=nil;
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Card No is not valid" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Try again" ,nil];
[alert show];
card_textField.text=nil;
}
}
息を呑むほど必要以上に複雑です。共通のObjective Cイディオムを使用しないためのボーナスポイント、および戻り値を含まないためのダブルボーナスポイント。 – tooluser
は、あなたがこれを解決終わるでしたか? – bryanmac