teclado numeros numericos especiales ejemplos ejemplo definicion datos computador codigos caracteres alfanumericos alfanumerico cocoa cocoa-touch nsstring nscharacterset

cocoa - numeros - teclado alfanumerico definicion



Pele los caracteres no alfanuméricos de un NSString (8)

Estoy buscando una manera rápida y fácil de quitar los caracteres no alfanuméricos de un NSString . Probablemente algo usando un NSCharacterSet , pero estoy cansado y nada parece devolver una cadena que contenga solo los caracteres alfanuméricos en una cadena.


Una categoría de limpieza

Tengo un método llamado stringByStrippingCharactersInSet: y stringByCollapsingWhitespace que podría ser conveniente para solo un drop-in.

@implementation NSString (Cleanup) - (NSString *)clp_stringByStrippingCharactersInSet:(NSCharacterSet *)set { return [[self componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""]; } - (NSString *)clp_stringByCollapsingWhitespace { NSArray *components = [self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''''"]]; return [components componentsJoinedByString:@" "]; } @end


Aquí hay una versión de Swift de la categoría de Cameron como extensión:

extension String { func stringByStrippingCharactersInSet(set:NSCharacterSet) -> String { return (self.componentsSeparatedByCharactersInSet(set) as NSArray).componentsJoinedByString("") } func stringByCollapsingWhitespace() -> String { var components:NSArray = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) let predicate = NSPredicate(format: "self <> ''''", argumentArray: nil) components = components.filteredArrayUsingPredicate(predicate) return components.componentsJoinedByString(" ") } }


El ciclo simple sería el tiempo de ejecución más rápido, creo:

@implementation NSString(MyUtil) - (NSString*) stripNonNumbers { NSMutableString* res = [NSMutableString new]; //NSCharacterSet *numericSet = [NSCharacterSet decimalDigitCharacterSet]; for ( int i=0; i < self.length; ++i ) { unichar c = [self characterAtIndex:i]; if ( c >= ''0'' && c <= ''9'' ) // this looks cleaner, but a bit slower: [numericSet characterIsMember:c]) [res appendFormat:@"%c", c]; } return res; } @end


En Swift, los componentsJoinedByString se reemplazan por join(...) , así que aquí simplemente reemplaza los caracteres no alfanuméricos con un espacio.

let charactersToRemove = NSCharacterSet.alphanumericCharacterSet().invertedSet let strippedReplacement = " ".join(someString.componentsSeparatedByCharactersInSet(charactersToRemove))

Para Swift2 ...

var enteredByUser = field.text .. or whatever let unsafeChars = NSCharacterSet.alphanumericCharacterSet().invertedSet enteredByUser = enteredByUser .componentsSeparatedByCharactersInSet(unsafeChars) .joinWithSeparator("")

Si desea eliminar solo un carácter, por ejemplo, eliminar todo vuelve ...

enteredByUser = enteredByUser .componentsSeparatedByString("/n") .joinWithSeparator("")


Lo que terminé haciendo fue crear un NSCharacterSet y el método -invertedSet que encontré (es una maravilla lo que hace una hora extra de sueño para las habilidades de lectura de documentación). Aquí está el fragmento de código, suponiendo que someString es la cadena desde la que desea eliminar los caracteres no alfanuméricos:

NSCharacterSet *charactersToRemove = [[ NSCharacterSet alphanumericCharacterSet ] invertedSet ]; NSString *trimmedReplacement = [ someString stringByTrimmingCharactersInSet:charactersToRemove ];

trimmedReplacement contendrá los caracteres alfanuméricos de algunos someString .


Podemos hacer esto dividiendo y luego uniéndonos. Requiere OS X 10.5+ para los componentesSeparatedByCharactersInSet:

NSCharacterSet *charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; NSString *strippedReplacement = [[someString componentsSeparatedByCharactersInSet:charactersToRemove] componentsJoinedByString:@""];


Swift 3 versión de la respuesta aceptada:

let unsafeChars = CharacterSet.alphanumerics.inverted let myStrippedString = myString.components(separatedBy: unsafeChars).joined(separator: "")


Esta es una forma más efectiva que la respuesta provista

+ (NSString *)alphanumericString:(NSString *)s { NSCharacterSet * charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; NSMutableString * ms = [NSMutableString stringWithCapacity:[s length]]; for (NSInteger i = 0; i < s.length; ++i) { unichar c = [s characterAtIndex:i]; if (![charactersToRemove characterIsMember:c]) { [ms appendFormat:@"%c", c]; } } return ms; }

o como una Categoría

@implementation NSString (Alphanumeric) - (NSString *)alphanumericString { NSCharacterSet * charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; NSMutableString * ms = [NSMutableString stringWithCapacity:[self length]]; for (NSInteger i = 0; i < self.length; ++i) { unichar c = [self characterAtIndex:i]; if (![charactersToRemove characterIsMember:c]) { [ms appendFormat:@"%c", c]; } } return ms; } @end