Objective c: Check if integer/int/number

36,690

Solution 1

You can use the intValue method on NSString:

NSString *myString = @"123";
[myString intValue]; // returns (int)123

Here is the Apple documentation for it - it will return 0 if it's not a valid integer: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/intValue

Hope that helps!

Solution 2

If you're trying to determine whether or not an NSString has a numeric value or not, try using NSNumberFormatter.

-(BOOL) stringIsNumeric:(NSString *) str {
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    NSNumber *number = [formatter numberFromString:str];
    [formatter release];
    return !!number; // If the string is not numeric, number will be nil
}

Solution 3

I've put this in my category NSString (Util).

- (BOOL) isInt {
    if ([self isEqualToString:@"0"])
        return YES;
    return (self.intValue != 0);
}

Solution 4

To check if a NSNumber if an integer try:

const char *t = [(NSNumber *)value objCType];
if (strcmp("i", t) == 0); // YES if integer

Solution 5

For NSString, if you use intValue/integerValue, there are certain cases which are not handled as it takes into consideration only the beginning the string.

For example @"bl3h" was not considered an integer but @" 3h" gave an output of 3

My solution for NSString:

Use :

NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:strName];

NSCharacterSet *numSet = [NSCharacterSet decimalDigitCharacterSet];

if([numSet isSupersetOfSet: charSet])
{
     // It is an integer (or it contains only digits)
}
Share:
36,690
Daniel
Author by

Daniel

Software & Web Developer

Updated on June 03, 2020

Comments

  • Daniel
    Daniel almost 4 years

    In objective c, how can i check if a string/NSNumber is an integer or int

  • Daniel
    Daniel over 13 years
    How can i find if a variable is a string?
  • codykrieger
    codykrieger over 13 years
    As in, you want to check and see if some user input is just a plain old string or a number? Like I said above, intValue returns 0 for when an NSString is not a valid integer. Say you're getting info from a UITextView - [[myTextView text] intValue] would return a valid int if possible, or 0 if it can't be validated as an int.
  • Daniel
    Daniel over 13 years
    Well see the problem is. Sometimes the user will not enter any input. because it is not required. And since i'm using an array and grabbing the object from it. I'm getting *** -[NSCFArray objectAtIndex:]: index (3) beyond bounds (3) i need to check if the array is valid somehow?
  • TOMKA
    TOMKA over 13 years
    What if the string represents the actual integer value 0?
  • codykrieger
    codykrieger over 13 years
    Could you maybe post some of your code so we can get a better feel for what's going on?
  • jpswain
    jpswain over 12 years
    @Daniel you could create a notNil helper method and then assign NSNull to your array if a value is nil. like this: -(id)notNil:arg { if (arg == nil) { return [NSNull null]; } else { return arg; } This is working well for me.
  • Scott Means
    Scott Means over 12 years
    I thought I was the only one who did the !! hack to coerce to boolean. Nice!
  • ekinnear
    ekinnear over 11 years
    You can check if that value is in the array (if you're referring to the index) because it will be between 0 and [array count] -1
  • lindon fox
    lindon fox about 11 years
    This question is better than the approved answer because it gives you a true/false result. The approved answer does not.
  • hebime
    hebime over 10 years
    Be careful with this. This will only return 0 if the string doesn't begin with an integer value. Something like "123 street" will still return the integer 123. Source: developer.apple.com/library/mac/documentation/Cocoa/Referenc‌​e/…
  • jcesarmobile
    jcesarmobile over 10 years
    This is better, because the accepted answer doesn't work as expected if you check a string with letters that starts with number. Example "1234asdf" will return 1234, not 0, this returns NO. And "000" will return 0 and you might think is wrong but it's not
  • aroth
    aroth about 10 years
    Not the best solution. Note that [@"abc" intValue] will return 0. Can lead to confusing results.
  • kraftydevil
    kraftydevil over 9 years
    I couldn't use this because it didn't work in all cases.
  • XMB5
    XMB5 almost 4 years
    Would this depend on the user's locale?