iPad のデモ プロジェクト用に iOS 4 から iOS 3.2 に移植するコードがあります。私はこのコードを持っています:
+(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];
}
}
また、文字列を解析しようとすると、EXC_BAD_ACCESS シグナルが発生します1/1/2001
。何か案は?(iOS 4 以上はこちらで定義されています: http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html )
新しいエラーがあります: 数値を解析すると、正確ではなくなりました (float に同じコードを使用した場合に複数の小数点があるのと同じです)。どうすれば修正できますか?? (@joshpaulの回答を使用するだけかもしれません...)