quitar principio para metodo espacios espacio eliminar detectar blanco array agregar iphone objective-c nsstring nsarray

iphone - principio - quitar espacios en blanco mysql



¿Cómo elimino los espacios en blanco iniciales y finales de NSString dentro de una NSArray? (7)

Elimina los espacios en blanco iniciales y los espacios en blanco finales de la "cadena"

- (NSString*)stringByRemovingLeadingAndTrailingWhiteSpaces:(NSString*)string { NSArray * components = [string componentsSeparatedByString:@" "]; if([components count] == 1) { return string; } NSUInteger originalLength = [string length]; unichar buffer[originalLength+1]; [string getCharacters:buffer range:NSMakeRange(0, originalLength)]; NSMutableString * newStringNoLeadingSpace = [NSMutableString string]; BOOL goToStripTrailing = NO; for(int i = 0; i < originalLength; i++) { NSLog(@"%C", buffer[i]); NSString * newCharString = [NSString stringWithFormat:@"%c", buffer[i]]; if(goToStripTrailing == NO && [newCharString isEqualToString:@" "]) continue; goToStripTrailing = YES; [newStringNoLeadingSpace appendString:newCharString]; } NSUInteger newLength = [newStringNoLeadingSpace length]; NSMutableString * newString = [NSMutableString string]; unichar bufferSecondPass[newLength+1]; [newStringNoLeadingSpace getCharacters:bufferSecondPass range:NSMakeRange(0, newLength)]; int locationOfLastCharacter = (int)newLength; for(int i = (int)newLength - 1; i >= 0; i--) { NSLog(@"%C", bufferSecondPass[i]); NSString * newCharString = [NSString stringWithFormat:@"%c", bufferSecondPass[i]]; locationOfLastCharacter = i+1; if(![newCharString isEqualToString:@" "]) break; } NSRange range = NSMakeRange(0, locationOfLastCharacter); newString = [[NSString stringWithString:[newStringNoLeadingSpace substringWithRange:range]] copy]; return newString; }

Tengo un NSArray declarado como tal:

@property (nonatomic, strong) NSArray *arrayRefineSubjectCode;

Tengo los elementos del arreglo rellenados manualmente de la siguiente manera:

arrayRefineSubjectCode = [NSArray arrayWithObjects: @" BKKC 2061", @" BKKS 2631 ", @"BKKS 2381 ", nil];

Entonces, ¿cómo elimino el espacio en blanco inicial y final y hago que los elementos de cada matriz se conviertan en estos:

arrayRefineSubjectCode = [NSArray arrayWithObjects: @"BKKC 2061", @"BKKS 2631", @"BKKS 2381", nil];

He intentado usar "stringByTrimmingCharactersInSet:" pero solo funciona para NSString. Un poco confundido aquí. Por favor ayuda...


La NSArray y los objetos NSString contenidos son todos inmutables. No hay manera de cambiar los objetos que tienes.

En su lugar, debe crear nuevas cadenas y colocarlas en una nueva matriz:

NSMutableArray *trimmedStrings = [NSMutableArray array]; for (NSString *string in arrayRefineSubjectCode) { NSString *trimmedString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; [trimmedStrings addObject:trimmedString]; } arrayRefineSubjectCode = trimmedStrings;


Lea http://nshipster.com/nscharacterset/

NSString -stringByTrimmingCharactersInSet: es un método que debe conocer de memoria. A menudo se pasa NSCharacterSet + whitespaceCharacterSet o + whitespaceAndNewlineCharacterSet para eliminar el espacio en blanco inicial y final de la entrada de cadena.

Así, en Swift 3

let _ = " A B C ".trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) // A B C


Muta no, copia y reemplaza sí:

- (void)test_stringByTrimming { NSArray *arrayRefineSubjectCode = [NSArray arrayWithObjects: @" BKKC 2061", @" BKKS 2631 ", @"BKKS 2381 ", nil]; NSMutableArray *trimmedStrings = [NSMutableArray arrayWithArray:arrayRefineSubjectCode]; for (NSInteger i=0; i<trimmedStrings.count;i++) { [trimmedStrings setObject:[[arrayRefineSubjectCode objectAtIndex:i] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] atIndexedSubscript:i]; } XCTAssertTrue([[trimmedStrings objectAtIndex:0] isEqualToString:@"BKKC 2061"]); XCTAssertTrue([[trimmedStrings objectAtIndex:1] isEqualToString:@"BKKS 2631"]); XCTAssertTrue([[trimmedStrings objectAtIndex:2] isEqualToString:@"BKKS 2381"]); XCTAssertTrue([[arrayRefineSubjectCode objectAtIndex:0] isEqualToString:@" BKKC 2061"]); XCTAssertTrue([[arrayRefineSubjectCode objectAtIndex:1] isEqualToString:@" BKKS 2631 "]); XCTAssertTrue([[arrayRefineSubjectCode objectAtIndex:2] isEqualToString:@"BKKS 2381 "]); }


Nikolai tiene razón sobre la mutabilidad. Así que la forma más fácil de resolver las cosas es definir

@property (nonatomic, strong) NSMutableArray *arrayRefineSubjectCode;

y luego inserte las cadenas una por una, por ejemplo

for ( int counter = 0 ; counter < 3 ; counter++ ) { NSMutableString *s = [NSMutableString stringWithFormat:@" blah "]; [arrayRefineSubjectCode addObject:s]; }

... para obtener tres elementos con "bla" en ella. Tenga en cuenta que no puede agregarObject a un NSArray inmutable, solo a un NSMutableArray mutable.

Por supuesto, es posible que ya tenga las cuerdas con espacios superfluos en algún lugar. Tendrá que hacer una copia mutable (!) De esas cadenas y agregarlas a la matriz arrayRefineSubjectCode con addObject. Puede eliminar los espacios antes o después de agregarlos a la matriz.

Espero que esto ayude un poco.

Solo pensé en añadir un último comentario. Podrías preguntarte por qué usarías objetos inmutables de todos modos. Hay algunas razones, pero si puede salirse con la suya inmutable, resultan en un código más rápido, la copia es fácil (solo copie el puntero a la dirección que contiene los datos, porque esos datos no cambiarán de todos modos), y es es más probable que sea seguro para subprocesos. ¡Por supuesto, tenga cuidado con una NSArray que apunta a objetos mutables como NSMutableString!


SSToolkit tiene un par de categorías agradables para esto: editar: el enlace está roto y parece que ya no está en SSToolkit .

Este es el código antiguo:

- (NSString *)stringByTrimmingLeadingAndTrailingCharactersInSet:(NSCharacterSet *)characterSet { return [[self stringByTrimmingLeadingCharactersInSet:characterSet] stringByTrimmingTrailingCharactersInSet:characterSet]; } - (NSString *)stringByTrimmingLeadingAndTrailingWhitespaceAndNewlineCharacters { return [[self stringByTrimmingLeadingWhitespaceAndNewlineCharacters] stringByTrimmingTrailingWhitespaceAndNewlineCharacters]; } - (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet { NSRange rangeOfFirstWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]]; if (rangeOfFirstWantedCharacter.location == NSNotFound) { return @""; } return [self substringFromIndex:rangeOfFirstWantedCharacter.location]; } - (NSString *)stringByTrimmingLeadingWhitespaceAndNewlineCharacters { return [self stringByTrimmingLeadingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } - (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet { NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet] options:NSBackwardsSearch]; if (rangeOfLastWantedCharacter.location == NSNotFound) { return @""; } return [self substringToIndex:rangeOfLastWantedCharacter.location + 1]; // Non-inclusive } - (NSString *)stringByTrimmingTrailingWhitespaceAndNewlineCharacters { return [self stringByTrimmingTrailingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; }

Sin embargo, en lugar de eliminar varias veces con diferentes conjuntos de caracteres, puede ser mejor crear una unión de todos los conjuntos de caracteres que desea eliminar. NSMutableCharacterSet es tu amigo allí.


NSString *newString = [someString stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];