Ios NSString为每4个字符追加空白

Ios NSString为每4个字符追加空白,ios,objective-c,xcode,nsstring,nsmutablestring,Ios,Objective C,Xcode,Nsstring,Nsmutablestring,我有一个类似@“12341234112341234”的字符串,我需要在每4个字符之间添加空格,如 @"1234 1234 1234 1234" i、 我需要一个类似Visa卡类型的NSString。我试过这样做,但没有得到结果 -(void)resetCardNumberAsVisa:(NSString*)aNumber { NSMutableString *s = [aNumber mutableCopy]; for(int p=0; p<[s length]; p++)

我有一个类似@“12341234112341234”的字符串,我需要在每4个字符之间添加空格,如

@"1234 1234 1234 1234"
i、 我需要一个类似Visa卡类型的
NSString
。我试过这样做,但没有得到结果

-(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);
}
-(void)ResetCardNumberVisa:(NSString*)一个数字
{
NSMutableString*s=[anumbermutablecopy];
对于(int p=0;pdo what do you want:

- (NSString *)insertSpacesEveryFourDigitsIntoString:(NSString *)string
              andPreserveCursorPosition:(NSUInteger *)cursorPosition 
{
    NSMutableString *stringWithAddedSpaces = [NSMutableString new];
    NSUInteger cursorPositionInSpacelessString = *cursorPosition;
    for (NSUInteger i=0; i<[string length]; i++) {
        if ((i>0) && ((i % 4) == 0)) {
            [stringWithAddedSpaces appendString:@" "];
            if (i < cursorPositionInSpacelessString) {
                (*cursorPosition)++;
            }
        }
        unichar characterToAdd = [string characterAtIndex:i];
        NSString *stringToAdd = 
            [NSString stringWithCharacters:&characterToAdd length:1];

        [stringWithAddedSpaces appendString:stringToAdd];
    }

    return stringWithAddedSpaces;
}
-(NSString*)InsertSpaceSeveryFourDigitIntostring:(NSString*)字符串
andPreserveCursorPosition:(nsInteger*)cursorPosition
{
NSMutableString*StringWithAddedSpace=[NSMutableString new];
NSUTEGER CURSORPOSITIONSPACELESSSTRING=*cursorPosition;
对于(i=0;i0)和((i%4)==0)){
[StringWithAddedSpacesAppendString:@”“;
if(i
您的代码非常接近,但是该方法的一个更好的语义是为任何给定的输入字符串返回一个新的
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;
}
-(NSString*)格式字符串ASVISA:(NSString*)编号
{
NSMutableString*newStr=[NSMutableString new];
对于(整数i=0;i<[a个数长度];i++)
{
如果(i>0&&i%4==0)
[newStr appendString:@”“;
unichar c=[a个字符索引:i];
[newStr appendString:[[NSString alloc]initWithCharacters:&c长度:1]];
}
返回新闻TR;
}

您应该这样做:

- (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;
}
根据您的代码,在第一次插入空格字符时,您将在处插入“1”位置为4

然后,字符串是:

Text:     1234 12341234
Location: 0123456789012
所以,您看到了,现在您必须在位置处插入第二个空格字符是9(9%4!=0)


希望你能自己修复你的代码

下面是一个unicode感知实现,作为
NSString
上的一个类别:

Text:     123412341234
Location: 012345678901
@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
使用此测试字符串进行尝试:

NSString *string = @"ab swift3 based on Droppy

func codeFormat(_ code: String) -> String {
    let newStr = NSMutableString()
    for i in 0..<code.characters.count {
        if (i > 0 && i % 4 == 0){
            newStr.append(" ")
        }
            var c = (code as NSString).character(at: i)
            newStr.append(NSString(characters: &c, length: 1) as String)
    }
    return newStr as String
}
NSString*string=@“abswift3基于Droppy

- (NSString*) fillWhiteGapWithString:(NSString*)source
{
    NSInteger dl = 4;
    NSMutableString* result = [NSMutableString stringWithString:source];
    for(NSInteger cnt = result.length - dl ; cnt > 0 ; cnt -= dl)
    {
        [result insertString:@" " atIndex:cnt];
    }
    return result;
}
func代码格式(\ucode:String)->String{
让newStr=NSMutableString()
对于0..0中的i&&i%4==0){
newStr.append(“”)
}
var c=(代码为NSString).character(at:i)
newStr.append(NSString(字符:&c,长度:1)作为字符串)
}
返回newStr作为字符串
}

请确保字符串长度乘以4。
此解决方案将首先插入右侧


那是什么新闻?太棒了,谢谢你做了很多工作。你救了我的命。。ACCEPTED@HarishSaran好吧,不过请注意,就性能而言,它有点昂贵,因为
NSMutableString
没有
appendCharacter
方法,因此您必须从单个字符创建字符串才能进行追加。更好的实现ation将使用一个
unichar
字符数组作为临时缓冲区,但就这个问题而言,这对我来说太多了。可能是重复的。您希望在
UITextField
上编辑时动态格式化它,还是您拥有完整的数字并希望在其中插入空格?真正的工程角。在这个若你们的字符串不能被4整除,那个么删除最后一部分,只是想知道,谢谢