如何将字符串格式化为信用卡格式

时间:2013-08-20 15:59:23

标签: objective-c cocoa-touch string-formatting

在IOS中将字符串“1234567890123456789”格式化为“1234 5678 9012 3456 789”的最简单方法是什么?

5 个答案:

答案 0 :(得分:3)

对于该特定格式,您可以执行以下操作,提取单个子字符串:

NSString *string = @"1234567890123456789";
NSMutableArray *array = [NSMutableArray array];
for (NSInteger i = 0; i < [string length]; i += 4)
    [array addObject:[string substringWithRange:NSMakeRange(i, MIN(4, [string length] - i))]];
NSString *result = [array componentsJoinedByString:@" "];

问题是,并非所有信用卡都符合xxxx xxxx xxxx xxxx格式。例如,Amex使用xxxx xxxxxx xxxxx格式。你真的应该看看卡的第一个数字,确定卡的类型,并相应地格式化。


您问是否可以使用正则表达式执行此操作。考虑一下这个正则表达式:

NSString *result = [string stringByReplacingOccurrencesOfString:@"^[\\s-]*([0-9]{4})[\\s-]*([0-9]{4})[\\s-]*([0-9]{4})[\\s-]*([0-9]{4})[\\s-]*([0-9]{3})[\\s-]*$"
                                                     withString:@"$1 $2 $3 $4 $5"
                                                        options:NSRegularExpressionSearch
                                                          range:NSMakeRange(0, [string length])];

这将转换以下任何内容:

@"1234567890123456789"
@"1234-5678-9012-3456-789"
@"  1234567890123456789  "

成:

@"1234 5678 9012 3456 789"

虽然你可以使用正则表达式,但它是非常不透明的,我不会特别建议它。但它可以做到。

答案 1 :(得分:3)

试试这个:

-(NSString *) correctString:(NSString *) anyStr {

  NSMutableString *str=[NSMutableString stringWithString:anyStr];
int indx=4;
while (indx<str.length) {
    [str insertString:@" " atIndex:indx];
    indx +=5;
}
anyStr=str;
return anyStr;
}

答案 2 :(得分:0)

我写了代码。

NSMutableString *string = @"1234567890123456789"; 

NSInteger *ip = 4;

for (NSInteger i = 0; i*4 < [string length] ; i++)
{
    [string insertString:@" " atIndex:ip];
    ip = ip+5;
}

答案 3 :(得分:0)

我建议使用NSString类别。在非ARC中,只需在自我复制后添加自动释放。 如果不是必要的话,我的变体将不会在最后一个数字季度之后添加空格。 适用于UITextField。

- (NSString *)creditCardNumberFormatedString {
    NSString *string = [self copy];
    NSUInteger length = string.length;
    if (length >= 17) {
        string = [string substringToIndex:16];
        length = 16;
    }

    BOOL isSpaceRequired = YES;
    if (length == 4) {
        isSpaceRequired = NO;

    }

    NSString *newString = [NSString new];
    while (string.length > 0) {
        NSString *subString = [string substringToIndex:MIN(string.length, 4)];
        newString = [newString stringByAppendingString:subString];
        if (subString.length == 4 && isSpaceRequired) {
            newString = [newString stringByAppendingString:@" "];
        }

        string = [string substringFromIndex:MIN(string.length, 4)];
        if (string.length <= 4) {
            isSpaceRequired = NO;
        }
    }

    return newString;
}

答案 4 :(得分:0)

这是一个Swift扩展名:

extension String {
    var pairs: [String] {
        var result: [String] = []
        let chars = Array(characters)
        for index in 0.stride(to: chars.count, by: 4) {
            result.append(String(chars[index..<min(index+4, chars.count)]))
        }
        return result
    }
}

使用:

let string : String = "1234567890123456789"
let finalString = string.pairs.joinWithSeparator(" ") //1234 5678 9012 3456 789
print(finalString)

对于Swift 3:

extension String {
    var pairs: [String] {
        var result: [String] = []
        let chars = Array(characters)
        for index in stride(from: 0, to: chars.count, by: 4){
            result.append(String(chars[index..<min(index+4, chars.count)]))
        }
        return result
    }
}