NSString intValue not working for retrieving phone

2019-01-29 08:45发布

问题:

I have a phone number formatted as an easy to read phone number, i.e., (123) 123-4567

However, when I want to use that phone number in code, I need to parse that string into a number variable (such as an int)

However, [string intValue]; doesn't work - I've used intValue about a million times in previous projects, all with no problem, however here, every string I pass in, I get the same, random int back out:

- (int)processPhoneNumber:(NSString *)phoneNumber {
      NSMutableString *strippedString = [NSMutableString stringWithCapacity:10];

      for (int i=0; i<[phoneNumber length]; i++) {
           if (isdigit([phoneNumber characterAtIndex:i])) {
                  [strippedString appendFormat:@"%c",[phoneNumber characterAtIndex:i]];
           }
      }

     NSLog(@"clean string-- %@", strippedString);

     int phoneNumberInt = [strippedString intValue];

     NSLog(@"**** %d\n &i", phoneNumberInt, phoneNumberInt);

     return phoneNumberInt;
}

Then when I call this method:

NSLog(@"%i", [self processPhoneNumber:self.phoneNumberTextField.text]);

I get: 2147483647. Every input I give this method returns: 2147483647

回答1:

As CRD has already explained, you're trying to convert that string to a type that's too small to hold the value, and you're getting back the maximum possible value for that type.

Your real problem is deeper, however. A phone "number" isn't really a number. It doesn't represent a quantity. You would never perform arithmetic on one. It's actually a string of digits, and you should handle it that way. Don't convert it; just operate on the string.

See also What's the right way to represent phone numbers?



回答2:

2147483647 is INT_MAX which is returned on overflow. How large is your phone number, will it fit into an int? Maybe you should use longLongValue?