0

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

4

5 回答 5

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 格式。例如,美国运通使用 xxxx xxxxxx xxxxxx 格式。您确实应该查看卡的前几位,确定卡的类型,并相应地对其进行格式化。


您问是否可以使用正则表达式来做到这一点。考虑这个正则表达式:

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”

虽然您可以使用正则表达式,但它足够不透明,我不会特别建议它。但这是可以完成的。

于 2013-08-20T16:34:46.380 回答
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;
}
于 2013-08-20T16:35:58.233 回答
0

我写了代码。

NSMutableString *string = @"1234567890123456789"; 

NSInteger *ip = 4;

for (NSInteger i = 0; i*4 < [string length] ; i++)
{
    [string insertString:@" " atIndex:ip];
    ip = ip+5;
}
于 2013-08-20T16:54:57.970 回答
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;
}
于 2014-11-06T08:39:07.273 回答
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)

对于斯威夫特 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
    }
}
于 2017-06-16T10:32:54.890 回答