检查String是否具有有效数字

时间:2014-03-28 22:42:44

标签: ios objective-c nsstring unsigned-long-long-int

我是一个编程新手,我目前正在编写一个目标c的转换计算程序,我真的很挣扎。

我有一个表示无符号long long值的字符串。在尝试添加另一个字符以检查新字符在添加之前是否超过LONG_LONG_MAX时,我需要一种方法。如果值为/将高于LONG_LONG_MAX

,则删除最后一个字符

我能想到的唯一可能的方法就是:

- (BOOL) isNumberStringValid:(NSString *)stringValue {
      unsigned long long uVal = strtoull(stringValue.UTF8String, NULL, 0);

      if (uVal <= ULLONG_MAX) return TRUE;
      else return FALSE;
}

我知道这不起作用,因为uVal总是&lt; = ULLONG_MAX但我想不出任何其他可能检查的方法。任何人都可以帮我找到实现这个目标的方法吗?

3 个答案:

答案 0 :(得分:1)

如果给定strtoull()errno的值设置为ERANGE,您可以使用这一事实 字符串超出范围:

- (BOOL) isNumberStringValid:(NSString *)stringValue {
    errno = 0;
    unsigned long long uVal = strtoull(stringValue.UTF8String, NULL, 0);
    return (errno == 0);
}

一些测试(ULLONG_MAX = 2 64 -1 = 18446744073709551615):

1234 : TRUE
18446744073709551615 : TRUE
18446744073709551616 : FALSE
1844674407370955161678 : FALSE

答案 1 :(得分:0)

您可以使用NSNumberFormatter。不幸的是,NSNumberFormatter存储了最大的&#39;值为浮点数,因此LONG_LONG_MAX的边界周围存在一些问题。为了解决这个问题,这段代码会检查nil或者一个长的负值(这意味着它溢出)

-(BOOL) isNumberStringValid:(NSString *)stringValue
{

    [NSNumberFormatter setDefaultFormatterBehavior:NSNumberFormatterBehavior10_4];
    NSNumberFormatter *f=[[NSNumberFormatter alloc]init];

    NSNumber *max=[NSNumber numberWithLongLong:LONG_LONG_MAX];

    [f setMaximum:max];

    BOOL valid=NO;

    NSNumber *num=[f numberFromString:stringValue];
    if (num != nil)       // A nil value means that input was > LONG_LONG_MAX
    {
       long long x=[num unsignedLongLongValue];  // A negative value here means that the input was > LONG_LONG_MAX
       if (x>0)
       {
        valid=YES;        
       }
    }
    return valid;
}

答案 2 :(得分:-1)

你的if语句是检查uVal是否小于或等于LONG_LONG_MAX

unsigned long long uVal = (unsigned)stringValue.longLongValue;
if (uVal >= LONG_LONG_MAX) {
    return YES;
}
else {
    return NO;
}

我跑了这个并且工作正常。