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