Objective-C: Find numbers in string

前端 未结 7 1027
遇见更好的自我
遇见更好的自我 2020-11-27 04:37

I have a string that contains words as well as a number. How can I extract that number from the string?

NSString *str = @\"This is my string. #1234\";


        
相关标签:
7条回答
  • 2020-11-27 04:48

    NSPredicate is the Cocoa class for parsing string using ICU regular expression.

    0 讨论(0)
  • 2020-11-27 05:02

    Here's an NSScanner based solution:

    // 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];
    

    (Some of the many) assumptions made here:

    • Number digits are 0-9, no sign, no decimal point, no thousand separators, etc. You could add sign characters to the NSCharacterSet if needed.
    • There are no digits elsewhere in the string, or if there are they are after the number you want to extract.
    • The number won't overflow int.

    Alternatively you could scan direct to the int:

    [scanner scanUpToCharactersFromSet:numbers intoString:NULL];
    int number;
    [scanner scanInt:&number];
    

    If the # marks the start of the number in the string, you could find it by means of:

    [scanner scanUpToString:@"#" intoString:NULL];
    [scanner setScanLocation:[scanner scanLocation] + 1];
    // Now scan for int as before.
    
    0 讨论(0)
  • 2020-11-27 05:02

    By far the best solution! I think regexp would be better, but i kind of sux at it ;-) this filters ALL numbers and concats them together, making a new string. If you want to split multiple numbers change it a bit. And remember that when you use this inside a big loop it costs performance!

        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]);
    
    0 讨论(0)
  • 2020-11-27 05:05

    Self contained solution:

    + (NSString *)extractNumberFromText:(NSString *)text
    {
      NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
      return [[text componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@""];
    }
    

    Handles the following cases:

    • @"1234" → @"1234"
    • @"001234" → @"001234"
    • @"leading text get removed 001234" → @"001234"
    • @"001234 trailing text gets removed" → @"001234"
    • @"a0b0c1d2e3f4" → @"001234"

    Hope this helps!

    0 讨论(0)
  • 2020-11-27 05:09

    Try this answer from Stack Overflow for a nice piece of C code that will do the trick:

    for (int i=0; i<[str length]; i++) {
            if (isdigit([str characterAtIndex:i])) {
                    [strippedString appendFormat:@"%c",[str characterAtIndex:i]];
            }
    }
    
    0 讨论(0)
  • 2020-11-27 05:10

    You could use the NSRegularExpression class, available since iOS SDK 4.

    Bellow a simple code to extract integer numbers ("\d+" regex pattern) :

    - (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; 
    }
    
    0 讨论(0)
提交回复
热议问题