por - numero de serie iphone robado
Objective-C: Encuentra nĂºmeros en una cadena (7)
¡De lejos la mejor solución! Creo que la expresión regular sería mejor, pero soy bastante sutil ;-) esto filtra TODOS los números y los combina, creando una nueva cadena. Si quieres dividir varios números, cámbialo un poco. ¡Y recuerda que cuando usas esto dentro de un gran ciclo, cuesta rendimiento!
NSString *str= @"bla bla bla #123 bla bla 789";
NSMutableString *newStr = [[NSMutableString alloc] init];;
int j = [str length];
for (int i=0; i<j; i++) {
if ([str characterAtIndex:i] >=48 && [str characterAtIndex:i] <=59) {
[newStr appendFormat:@"%c",[str characterAtIndex:i]];
}
}
NSLog(@"%@ as int:%i", newStr, [newStr intValue]);
Tengo una cadena que contiene palabras y un número. ¿Cómo puedo extraer ese número de la cadena?
NSString *str = @"This is my string. #1234";
Me gustaría poder eliminar 1234 como int. La cadena tendrá diferentes números y palabras cada vez que la busque.
Ideas?
Aquí hay una solución basada en NSScanner :
// Input
NSString *originalString = @"This is my string. #1234";
// Intermediate
NSString *numberString;
NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
// Throw away characters before the first number.
[scanner scanUpToCharactersFromSet:numbers intoString:NULL];
// Collect numbers.
[scanner scanCharactersFromSet:numbers intoString:&numberString];
// Result.
int number = [numberString integerValue];
(Algunas de las muchas) suposiciones hechas aquí:
- Los dígitos numéricos son 0-9, sin signo, sin punto decimal, sin miles de separadores, etc. Puede agregar caracteres de signo al conjunto de caracteres NSC si es necesario.
- No hay dígitos en ninguna otra parte de la cadena, o si los hay después del número que desea extraer.
- El número no se desbordará
int
.
Alternativamente, puede escanear directamente a la int
:
[scanner scanUpToCharactersFromSet:numbers intoString:NULL];
int number;
[scanner scanInt:&number];
Si el #
marca el inicio del número en la cadena, puede encontrarlo mediante:
[scanner scanUpToString:@"#" intoString:NULL];
[scanner setScanLocation:[scanner scanLocation] + 1];
// Now scan for int as before.
Extensión Swift para obtener el número de la cadena
extension NSString {
func getNumFromString() -> String? {
var numberString: NSString?
let thisScanner = NSScanner(string: self as String)
let numbers = NSCharacterSet(charactersInString: "0123456789")
thisScanner.scanUpToCharactersFromSet(numbers, intoString: nil)
thisScanner.scanCharactersFromSet(numbers, intoString: &numberString)
return numberString as? String;
}
}
Prueba esta respuesta de para obtener una buena pieza de código C que hará el truco:
for (int i=0; i<[str length]; i++) {
if (isdigit([str characterAtIndex:i])) {
[strippedString appendFormat:@"%c",[str characterAtIndex:i]];
}
}
Puede usar la clase NSRegularExpression, disponible desde iOS SDK 4.
A continuación un código simple para extraer números enteros (patrón regex "/ d +" ):
- (NSArray*) getIntNumbersFromString: (NSString*) string {
NSMutableArray* numberArray = [NSMutableArray new];
NSString* regexPattern = @"//d+";
NSRegularExpression* regex = [[NSRegularExpression alloc] initWithPattern:regexPattern options:0 error:nil];
NSArray* matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)];
for( NSTextCheckingResult* match in matches) {
NSString* strNumber = [string substringWithRange:match.range];
[numberArray addObject:[NSNumber numberWithInt:strNumber.intValue]];
}
return numberArray;
}
Solución autónoma:
+ (NSString *)extractNumberFromText:(NSString *)text
{
NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
return [[text componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];
}
Maneja los siguientes casos:
- @ "1234" → @ "1234"
- @ "001234" → @ "001234"
- @ "texto inicial eliminado 001234" → @ "001234"
- @ "001234 el texto final se elimina" → @ "001234"
- @ "a0b0c1d2e3f4" → @ "001234"
¡Espero que esto ayude!
NSPredicate es la clase Cocoa para analizar cadena utilizando la expresión regular de ICU .