2

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

我有一个表示 unsigned 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 总是 <= ULLONG_MAX 但我想不出任何其他可能检查的方法。谁能帮我找到一种方法来完成这个???

4

3 回答 3

1

如果给定字符串超出范围,您可以使用strtoull()将值设置为errnoto的事实: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
于 2014-03-29T08:46:57.890 回答
0

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

-(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;
}
于 2014-03-28T23:15:42.810 回答
-1

您拥有的 if 语句正在检查 uVal 是否小于或等于 LONG_LONG_MAX

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

我跑了这个,它工作正常。

于 2014-03-28T23:22:36.677 回答