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.
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");
}
}];
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With