Formatação Rápida de Números de Cartão de Crédito

Você já se perguntou como você pode formatar um número de cartão de crédito em seu aplicativo? Talvez você tenha tentado algumas maneiras diferentes, por exemplo:stringByReplacingOccurrencesOfString:withString:options:range

Bem, vamos economizar algum tempo com expressões regulares 🙂

Por favor, entre em meu escritório –

 NSString *formattedCCNumber;
if ([self.creditCardNumber length] == 16) {
formattedCCNumber
= [self.creditCardNumber stringByReplacingOccurrencesOfString:@"(\d{4})(\d{4})(\d{4})(\d+)" withString:@"$1-$2-$3-$4" options:NSRegularExpressionSearch range:NSMakeRange(0, [self.creditCardNumber length])];
} else if ([self.creditCardNumber length] == 15) {
formattedCCNumber
= [self.creditCardNumber stringByReplacingOccurrencesOfString:@"(\d{4})(\d{6})(\d+)" withString:@"$1-$2-$3" options:NSRegularExpressionSearch range:NSMakeRange(0, [self.creditCardNumber length])];
}

self.ccNumberTextField.text = formattedCCNumber;

E abaixo está o método que substituímos em stringByReplacingOccurrencesOfString:withString:options:range

NSString *text = [textField text];
NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789b"];
string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""];
if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
return NO;
}

text
= [text stringByReplacingCharactersInRange:range withString:string];
text
= [text stringByReplacingOccurrencesOfString:@"-" withString:@""];

// Change credit card display for AMEX.
if ([text length] > 1 && [text characterAtIndex:0] == '3' && ([text characterAtIndex:1] == '4' || [text characterAtIndex:1] == '7')) {
NSString *newString = @"";
while (text.length > 0) {
// First set of numbers.
NSString *subString1 = [text substringToIndex:MIN(text.length, 4)];
newString
= [newString stringByAppendingString:subString1];
if (subString1.length == 4) {
newString
= [newString stringByAppendingString:@"-"];
}
if (subString1.length < 5) {
text
= [text substringFromIndex:MIN(text.length, 4)];
}
// Second set of numbers.
NSString *subString2 = [text substringToIndex:MIN(text.length, 6)];
newString
= [newString stringByAppendingString:subString2];
if (subString2.length == 6) {
newString
= [newString stringByAppendingString:@"-"];
}
if (subString2.length < 7) {
text
= [text substringFromIndex:MIN(text.length, 6)];
}
// Third set of numbers.
NSString *subString3 = [text substringToIndex:MIN(text.length, 5)];
newString
= [newString stringByAppendingString:subString3];
if (subString3.length < 16) {
text
= [text substringFromIndex:MIN(text.length, 15)];
}
}
newString
= [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];
if (newString.length > 17) {
return NO;
}
[textField setText:newString];
return NO;
} else {
// Display credit card number in sections of 4 for all other issuers.
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 > 19) {
return NO;
}
[textField setText:newString];
return NO;
}

O primeiro exemplo é muito mais conciso e legível. Mas cabe a você escolher o que deseja usar.