我是一个编程新手,我目前正在编写一个目标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但我想不出任何其他可能检查的方法。任何人都可以帮我找到实现这个目标的方法吗?
答案 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;
}
我跑了这个并且工作正常。