2014-03-28 106 views
2

我是一名编程新手,目前我正在编写一个转换计算程序在目标c中,我真的很挣扎。检查字符串是否有有效的数字

我有一个字符串表示一个无符号长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,但我想不出任何其他方式可能检查。任何人都可以帮助我找到一种方法来完成此?

回答

0

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

-(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; 
} 
+0

“[f setMaximum]”行中存在拼写错误 - 更正了 – Paulw11

+0

您也可以创建子类或创建自定义格式程序。 – uchuugaka

-1

的,如果你有语句检查是否uVal小于或等于LONG_LONG_MAX

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

我跑这个,它工作正常。

+0

您的逻辑看起来是相反的 - 如果数字太大,则返回yes,否则返回否 - 如果该数字有效,则函数应该返回YES,但由于分配时发生溢出,它也不起作用大于LONG_LONG_MAX到uVAL的数字。试试你的字符串等于“9223372036854775809” - 你最终得到了4294967295 – Paulw11

+0

Ahh好的抱歉。误读原始代码 – RASS

+0

确定此代码对我来说确实有效:'code'NSString * string = @“9223372036854775807”; unsigned long long uVal = strtoull(string.UTF8String,NULL,0); NSLog(@“%llu”,uVal);如果(uVal> = LONG_LONG_MAX){ NSLog(@“no”); return NO; } else { NSLog(@“yes”); 返回YES; } – RASS

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 -1 = 18446744073709551615):

1234 : TRUE 
18446744073709551615 : TRUE 
18446744073709551616 : FALSE 
1844674407370955161678 : FALSE 
相关问题