Как вставить символ в строку NSString - PullRequest
33 голосов
/ 04 января 2012

Как вставить пробел в строку NSString.

Мне нужно добавить пробел с индексом 5 в:

NString * dir = @"abcdefghijklmno";

Чтобы получить этот результат:

abcde fghijklmno

с:

NSLOG (@"%@", dir);

Ответы [ 6 ]

86 голосов
/ 04 января 2012

Вам нужно использовать NSMutableString

NSMutableString *mu = [NSMutableString stringWithString:dir];
[mu insertString:@" " atIndex:5];

или вы можете использовать этот метод для разделения вашей строки:

- substringFromIndex:
- substringWithRange:
- substringToIndex:

и рекомбинировать их после с

- stringByAppendingFormat:
- stringByAppendingString:
- stringByPaddingToLength: withString: начальныйAtIndex:

Но этот путь - больше проблем, чем он того стоит. А поскольку NSString является неизменным, вы бы поставили много объектов на создание ничего.


NSString *s = @"abcdefghijklmnop";
NSMutableString *mu = [NSMutableString stringWithString:s];
[mu insertString:@"  ||  " atIndex:5];
//  This is one option
s = [mu copy];
//[(id)s insertString:@"er" atIndex:7]; This will crash your app because s is not mutable
//  This is an other option
s = [NSString stringWithString:mu];
//  The Following code is not good
s = mu;
[mu replaceCharactersInRange:NSMakeRange(0, [mu length]) withString:@"Changed string!!!"];
NSLog(@" s == %@ : while mu == %@ ", s, mu);  
//  ----> Not good because the output is the following line
// s == Changed string!!! : while mu == Changed string!!! 

Что может привести к трудностям при отладке. Вот почему @property для строки обычно определяют как copy, поэтому, если вы получите NSMutableString, сделав копию, вы уверены, что она не изменится из-за какого-то другого неожиданного кода.

Я предпочитаю s = [NSString stringWithString:mu];, потому что вы не путаетесь с копированием изменяемого объекта и возвращением неизменного.

4 голосов
/ 18 сентября 2013

А вот, например, как вставить пробел каждые 3 символа ...

NSMutableString *mutableString = [NSMutableString new];
[mutableString setString:@"abcdefghijklmnop"];

for (int p = 0; p < [mutableString length]; p++) {
    if (p%4 == 0) {
        [mutableString insertString:@" " atIndex:p];
    }
}

NSLog(@"%@", mutableString);

результат: abc def ghi jkl mno p

2 голосов
/ 04 января 2012
NSMutableString *liS=[[NSMutableString alloc]init];  
for (int i=0; i < [dir length]; i++) 
{
    NSString *ichar  = [NSString stringWithFormat:@"%c", [lStr characterAtIndex:i]];
    [l1S appendString:ichar];
    if (i==5)  
    {
        [l1S appendString:@" "];
    }
}

dir=l1S;
NSLog(@"updated string is %@",dir);

Попробуйте, это поможет вам

1 голос
/ 19 сентября 2016

Для простой задачи вам нужно простое решение:

NString * dir = @"abcdefghijklmno";
NSUInteger index = 5;
dir = [@[[dir substringToIndex:index],[dir substringFromIndex:index]]componentsJoinedByString:@" "];
0 голосов
/ 05 июня 2018

Существует решение без использования изменяемой строки: замените символы в диапазоне длиной 0:

NSString * test = @"1234";
// Insert before "3", which is at index 2.
NSRange range = NSMakeRange(2, 0);
NSString * inserted = [test stringByReplacingCharactersInRange:range 
    withString:@"abc"]
NSLog(@"%@", inserted); // 12abc34
0 голосов
/ 29 августа 2017

На C ++ я обнаружил, что проще манипулировать std::string и затем конвертировать его в NSString.Например:

std::string text = "abcdefghijklmno";
text.insert(text.begin()+5, ' ');

NSString* result = [NSString stringWithUTF8String:text.c_str()];
...