NSNumberFormatter iOS 3.2错误?

时间:2010-11-03 23:29:13

标签: iphone objective-c ios4 nsnumberformatter ios32

我有代码,我正在从iOS 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,在字符串(例如日期,我遇到问题)时抛出异常: 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];
    }
}

当我尝试解析字符串1/1/2001时,我收到一个EXC_BAD_ACCESS信号。有任何想法吗? (此处定义了iOS 4或更高版本:http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html

我有一个新的错误:当我解析数字时,它不是精确的(确切地说,当它使用相同的浮动代码时,它有多个小数点)....我怎么能解决这个问题? (我可能只是使用@joshpaul的答案......)

2 个答案:

答案 0 :(得分:4)

我找不到任何特定于iOS的内容,但data formatting guide有这个有趣的段落:

  

注意:在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:

答案 1 :(得分:1)

所以基本[str intValue]不起作用?不,[scanner scanInt:&int]

如何使用NSCharacterSet,即:

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