Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSNumberFormatter iOS 3.2漏洞?_Iphone_Objective C_Ios4_Nsnumberformatter_Ios32 - Fatal编程技术网

Iphone NSNumberFormatter iOS 3.2漏洞?

Iphone NSNumberFormatter iOS 3.2漏洞?,iphone,objective-c,ios4,nsnumberformatter,ios32,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:[NSNum

我有代码,我正在从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上使用spendid,当字符串(例如日期,我遇到问题)出现以下情况时引发异常:
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\u BAD\u访问信号。有什么想法吗? (此处定义了iOS 4或更高版本:)


我有一个新的错误:当我解析数字时,它不再是精确的(精确的,因为当使用相同的代码进行浮点运算时,它有多个小数点)。。。。我怎样才能解决这个问题??(我可能只是使用@joshpaul的答案…

那么基本的
[str intValue]
就不起作用了?也不是,
[scanner scanInt:&int]

如何使用
NSCharacterSet
,即:

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

那么基本的
[str intValue]
不起作用了?也不是,
[scanner scanInt:&int]

如何使用
NSCharacterSet
,即:

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

我找不到任何特定于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上通过2010年1月1日,1将被解析,其余部分将被忽略。你可以通过看看你通过2010年2月1日是否得到2来检验这个假设


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

我找不到任何特定于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上通过2010年1月1日,1将被解析,其余部分将被忽略。你可以通过看看你通过2010年2月1日是否得到2来检验这个假设


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

您真的不应该为此使用异常。obj-c中的异常旨在表示程序员错误。像这样的数据错误应该使用基于NSError*的API。很抱歉,我的老板和我对
nils
只是在代码中到处运行有问题…@Kevin Ballard:使用此API无法指示错误值,因为任何int都是有效的。@JeremyP:我想到了一些解决方案。第一种方法是只返回NSNumber*,让调用者对其调用
-intValue
。第二种方法是确保有效调用总是将error参数置零,并声明返回值为0意味着调用方需要检查参数。第三种方法是返回BOOL,并在out参数中返回int。您真的不应该为此使用异常。obj-c中的异常旨在表示程序员错误。像这样的数据错误应该使用基于NSError*的API。很抱歉,我的老板和我对
nils
只是在代码中到处运行有问题…@Kevin Ballard:使用此API无法指示错误值,因为任何int都是有效的。@JeremyP:我想到了一些解决方案。第一种方法是只返回NSNumber*,让调用者对其调用
-intValue
。第二种方法是确保有效调用总是将error参数置零,并声明返回值为0意味着调用方需要检查参数。第三种方法是返回BOOL并在out参数中返回int。一个有趣的解决方案。。。。我不知道这对我来说是否可行。。我会试试@JeremyP写的内容,然后再看看你的答案一个有趣的解决方案。。。。我不知道这对我来说是否可行。。我会试试@JeremyP写的东西,然后再看看你的答案为什么不能是一个简单的
int.Parse()
call:)@Richard J.Ross III:你可以看看
NSDecimalNumber decimalNumberWithString:
为什么不能是一个简单的
int.Parse()
call:)@Richard J.Ross III:你可以看一下