我有从 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,它具有 value 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 的答案......)