2014-03-28 105 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 
相關問題