簡體   English   中英

NSNumberFormatter iOS 3.2錯誤?

[英]NSNumberFormatter iOS 3.2 Bug?

我有要從iPad 4移植到iOS 3.2的代碼,用於iPad上的演示項目。 我有以下代碼:

+(int) parseInt:(NSString *)str
{
    NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
    [nf setAllowsFloats:NO];
    [nf setMaximum:[NSNumber numberWithInt:INT_MAX]];
    [nf setMinimum:[NSNumber numberWithInt:INT_MIN]];

    @try {
        NSNumber *num = [nf numberFromString:str];
        if (!num)
            @throw [DataParseException exceptionWithDescription:@"the data is not in the correct format."]; 

        return [num intValue];
    }
    @finally {
        [nf release];
    }
}

這在iOS 4上可以有效,在字符串4(例如日期,我遇到問題)時拋出異常: 1/1/2010

出於某種原因,num不是nil,它的值為1 ,而在iOS 4上,它是nil,與預期的一樣。 我最初使用NSScanner是因為它比NSNumberFormatter易於使用,但是我遇到了同樣的問題,它不能解析整個字符串,而只能解析字符串中的第一個數字。

有什么我可以解決的方法,還是必須手動創建一個int解析器。 我寧願不使用基於C的方法,但是如果需要的話,我會的。

編輯:我已將代碼更新為:

 +(int) parseInt:(NSString *)str { NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; [nf setAllowsFloats:NO]; [nf setMaximum:[NSNumber numberWithInt:INT_MAX]]; [nf setMinimum:[NSNumber numberWithInt:INT_MIN]]; @try { IF_IOS4_OR_GREATER ( NSNumber *num = [nf numberFromString:str]; if (!num) @throw [DataParseException exceptionWithDescription:@"the data is not in the correct format."]; return [num intValue]; ) else { NSNumber *num = nil; NSRange range = NSMakeRange(0, str.length); NSError *err = nil; [nf getObjectValue:&num forString:str range:&range error:&err]; if (err) @throw [DataParseException exceptionWithDescription:[err description]]; if (range.length != [str length]) @throw [DataParseException exceptionWithDescription:@"Not all of the number is a string!"]; if (!num) @throw [DataParseException exceptionWithDescription:@"the data is not in the correct format."]; return [num intValue]; } } @finally { [nf release]; } } 

我得到一個EXC_BAD_ACCESS信號,當我嘗試解析字符串1/1/2001 有任何想法嗎? (此處定義了iOS 4或更高版本: http : //cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html

我有一個新的錯誤:當我解析數字時,它是不准確的(確切地說,當對浮點數使用相同的代碼時,它具有多個小數點)……如何解決這個問題? (我可能只使用@joshpaul的答案...)

我找不到特定於iOS的任何東西,但數據格式指南中有一段有趣的段落:

注意:在Mac OS v10.6之前, 即使只分析一部分字符串getObjectValue:forString:errorDescription:也將返回YES和一個對象值。 這是有問題的,因為您不確定字符串的哪一部分被解析。 對於在Mac OS v10.6或更高版本上鏈接的應用程序,如果無法分析字符串的一部分,則此方法將返回錯誤。 您可以使用getObjectValue:forString:range:error:獲得舊的行為; 此方法返回成功解析的子字符串的范圍。

如果numberFromString:是根據上述方法實現的,並且iOS 3.2 NSNumberFormatter基於10.5,而iOS 4版本是10.6,我將不會感到驚訝。

只是我的猜測。

如果您在iOS 3.2上通過1/1/2010,則將解析1,其余的將被忽略。 您可以通過查看是否通過2/1/2010來獲得2來檢驗假設。

解決方法似乎是使用getObjectValue:forString:range:error:

那么基本的[str intValue]不起作用嗎? 也沒有[scanner scanInt:&int]嗎?

怎樣使用NSCharacterSet ,即:

NSString *test = [str stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
if ([test length]) @throw ...;
return [str intValue];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM