Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSDataDetector detecting "phone number" text

The easiest way I can explain this problem is with a code sample and its output, but essentially what's happening is NSDataDetector is detecting a phone number within a string that includes the words "phone number".

NSError *error = nil;
NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                               error:&error];

NSArray *stringsToTest = @[
                           @"testing phone number 0123 4567891",
                           @"testing some other number 0123 4567892",
                           @"phone number 0123 4567893",
                           @"blah blah 0123 4567894",
                           @"testing telephone number 0123 4567895"
                           ];

for (NSString *string in stringsToTest)
{
    [dataDetector enumerateMatchesInString:string
                                   options:0
                                     range:NSMakeRange(0, string.length)
                                usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                                    NSLog(@"%@", result.phoneNumber);
                                }];
}

Output:

2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] phone number 0123 4567891
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] 0123 4567892
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] phone number 0123 4567893
2013-11-24 19:04:26.000 PhoneNumberDetector[21874:70b] 0123 4567894
2013-11-24 19:04:26.001 PhoneNumberDetector[21874:70b] 0123 4567895

I've read the documentation and searched around SO but can't find anything that indicates if this is the intended behaviour and, if so, why.

This happens on the 7.0 simulator as well as my iPhone 5s running 7.0.4.

If anyone can shed any light on this issue I'd greatly appreciate it.

Update: To clarify, I don't want the text "phone number" to be part of the result when accessing the NSTextCheckingResult phoneNumber property.

like image 660
Steve Wilford Avatar asked Nov 24 '13 19:11

Steve Wilford


1 Answers

While it does seem that this is a bug in Apple's code, there is a simple workaround if you want to extract just the number from the string by eliminating the non-numeric characters within a block:

NSError *error = nil;
    NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber
                                                                   error:&error];

    NSArray *stringsToTest = @[
                                @"testing phone number 0123 4567891",
                                @"testing some other number 0123 4567892",
                                @"phone number 0123 4567893",
                                @"blah blah 0123 4567894",
                                @"testing telephone number 0123 4567895",
                                @"phone",
                                @"number",
                                @"my phone number 1234587985",
                                @"this string does not contain a phone number"
                               ];

    for (NSString *string in stringsToTest)
    {
        [dataDetector enumerateMatchesInString:string
                                       options:0
                                         range:NSMakeRange(0, string.length)
                                    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
                                    {
                                        NSString *numberWithExtra = result.phoneNumber;
                                        NSCharacterSet *toRemove = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
                                        NSString *trimmed = [[numberWithExtra componentsSeparatedByCharactersInSet:toRemove] componentsJoinedByString:@""];
                                        if(trimmed && trimmed.length)
                                        {
                                            NSLog(@"%@", trimmed);
                                        }
                                        else
                                        {
                                            NSLog(@"No phone number");
                                        }
                                    }];
    }
like image 151
Adrian Avatar answered Sep 27 '22 17:09

Adrian