NSNumberFormatter iOS 3.2错误?
我有代码,我正在从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 个回复
瞧叮
不起作用?不,
? 那么使用
,即:
靛取糕奖穿
的实现也将返回
和对象值。这是有问题的,因为您无法确定解析了字符串的哪个部分。对于在Mac OS v10.6上或之后链接的应用程序,如果无法解析部分字符串,则此方法会返回错误。你可以使用
来获得旧的行为;此方法返回已成功解析的子字符串的范围。 如果
是按照上述方法实现的,并且iOS 3.2
基于10.5而iOS 4版本是10.6,我不会感到惊讶。 只是我的猜测。 如果您在iOS 3.2上通过1/1/2010,则将解析1并忽略其余部分。您可以通过查看当您通过2/1/2010时是否获得2来测试假设。 工作似乎是使用
。