web-dev-qa-db-fra.com

Comment insérer un caractère dans un NSString

Comment insérer un espace dans un NSString.

J'ai besoin d'ajouter un espace à l'index 5 dans:

NString * dir = @"abcdefghijklmno";

Pour obtenir ce résultat:

abcde fghijklmno

avec:

NSLOG (@"%@", dir);
32
JohnPortella

Vous devez utiliser NSMutableString 

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

ou vous pouvez utiliser ces méthodes pour diviser votre chaîne:

- substringFromIndex:
- substringWithRange:
- substringToIndex: 

et les recombiner après avec

- stringByAppendingFormat:
- stringByAppendingString:
- stringByPaddingToLength: withString: StartingAtIndex: 

Mais cette façon est plus de peine que ça vaut la peine. Et puisque NSString est immuable, vous pariez beaucoup pour la création d’objets pour rien.


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!!! 

Ce qui peut rendre difficile le débogage des problèmes .. C'est la raison pour laquelle @property pour chaîne est généralement défini comme copy alors si vous obtenez un NSMutableString, en faisant une copie, vous êtes sûr que cela ne changera pas à cause d'un code inattendu .

J'ai tendance à préférer s = [NSString stringWithString:mu]; parce que vous ne comprenez pas mal la copie d'un objet mutable et le retour d'un objet immuable.

85
Vincent Bernier

Et voici, par exemple, comment insérer un espace tous les 3 caractères ...

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);

résultat: abc def ghi jkl mno p

4
Muruganandham K
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);

Essayez ceci il vous aidera

2
KAREEM MAHAMMED

Pour une tâche simple, vous avez besoin d'une solution simple:

NString * dir = @"abcdefghijklmno";
NSUInteger index = 5;
dir = [@[[dir substringToIndex:index],[dir substringFromIndex:index]]componentsJoinedByString:@" "];
1
turingtested

Il existe une solution sans utiliser de chaîne mutable: remplacez les caractères dans une plage de longueur 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
DarkDust

Sur C++, j'ai trouvé plus facile de manipuler un std::string et de le convertir en un NSString. Par exemple.:

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

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