2011-10-19 7 views

答えて

0

お客様のアプリケーションでは、クレジットカード番号の確認のみを行うことができ、確認はできません(銀行が行う必要があります)。 これを参照するにはregular expression websiteを参照してください。

+0

単純なmod 10の計算ができるときに正規表現を使う理由は何ですか? – bryanmac

+0

はすべてのカードのカードの種類が異なるためです。例えば、あなたのチェックディジットアルゴリズムは、enRouteタイプのクレジットカードでは失敗します。 – Saurabh

+0

そのテーブルにはenRoute Active = No – bryanmac

13

の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 
+0

これはIMEI番号の検証にも適しています。 –

+0

それはうまく働いている。 – Raja

0
-(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; 
} 

} 
+1

息を呑むほど必要以上に複雑です。共通のObjective Cイディオムを使用しないためのボーナスポイント、および戻り値を含まないためのダブルボーナスポイント。 – tooluser