NSString每4个字符附加一次WhiteSpace

Har*_*ran 2 xcode objective-c nsstring nsmutablestring ios

我有一个像@"1234123412341234"的字符串,我需要在每4个字符之间追加空格.

@"1234 1234 1234 1234"
Run Code Online (Sandbox Code Playgroud)

也就是说,我需要NSString像Visa卡类型.我试过这样但我没有得到我的结果.

-(void)resetCardNumberAsVisa:(NSString*)aNumber
{
  NSMutableString *s = [aNumber mutableCopy];

  for(int p=0; p<[s length]; p++)
  {
    if(p%4==0)
    {
        [s insertString:@" " atIndex:p];
    }
  }
  NSLog(@"%@",s);
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*uhe 7

这是一个unicode感知实现作为一个类别NSString:

@interface NSString (NRStringFormatting)
- (NSString *)stringByFormattingAsCreditCardNumber;
@end

@implementation NSString (NRStringFormatting)
- (NSString *)stringByFormattingAsCreditCardNumber
{
    NSMutableString *result = [NSMutableString string];
    __block NSInteger count = -1;
    [self enumerateSubstringsInRange:(NSRange){0, [self length]}
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                              if ([substring rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]].location != NSNotFound)
                                  return;
                              count += 1;
                              if (count == 4) {
                                  [result appendString:@" "];
                                  count = 0;
                              }
                              [result appendString:substring];
                          }];
    return result;
}
@end
Run Code Online (Sandbox Code Playgroud)

尝试使用此测试字符串:

NSString *string = @"ab  132487 387  e e e ";
NSLog(@"%@", [string stringByFormattingAsCreditCardNumber]);
Run Code Online (Sandbox Code Playgroud)

该方法适用于非BMP字符(即表情符号)并处理现有的空白区域.


Dro*_*ppy 6

您的代码非常接近,但是该方法更好的语义是NSString为任何给定的输入字符串返回一个新的:

-(NSString *)formatStringAsVisa:(NSString*)aNumber
{
    NSMutableString *newStr = [NSMutableString new];
    for (NSUInteger i = 0; i < [aNumber length]; i++)
    {
        if (i > 0 && i % 4 == 0)
           [newStr appendString:@" "];
        unichar c = [aNumber characterAtIndex:i];
        [newStr appendString:[[NSString alloc] initWithCharacters:&c length:1]];
    }
    return newStr;
}
Run Code Online (Sandbox Code Playgroud)


Ton*_*ony 5

你应该这样做:

- (NSString *)resetCardNumberAsVisa:(NSString*)originalString {
    NSMutableString *resultString = [NSMutableString string];

    for(int i = 0; i<[originalString length]/4; i++)
    {
        NSUInteger fromIndex = i * 4;
        NSUInteger len = [originalString length] - fromIndex;
        if (len > 4) {
            len = 4;
        }

        [resultString appendFormat:@"%@ ",[originalString substringWithRange:NSMakeRange(fromIndex, len)]];
    }
    return resultString;
}
Run Code Online (Sandbox Code Playgroud)

更新:

您的代码将在第一个插入空间字符表中正确:

这是你的originalString:

Text:     123412341234
Location: 012345678901
Run Code Online (Sandbox Code Playgroud)

根据您的代码,在第一个插入空格字符时,您将插入"1"(位置为4)

之后,你的字符串是:

Text:     1234 12341234
Location: 0123456789012
Run Code Online (Sandbox Code Playgroud)

所以,你看,现在你必须在位置插入第二个空间字符是9(9%4 != 0)

希望您自己修复代码!