1

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の回答を使用するだけかもしれません...)

4

2 に答える 2

4

iOS に固有のものは見つかりませんでしたが、データ フォーマット ガイドには次の興味深い段落があります。

注: Mac OS v10.6 より前のバージョンでは、 の実装は、文字列の一部しか解析できなかった場合でもオブジェクト値getObjectValue:forString:errorDescription:を返します。文字列のどの部分が解析されたかを確認できないため、これには問題があります。Mac OS v10.6 以降でリンクされたアプリケーションの場合、文字列の一部を解析できない場合、このメソッドは代わりにエラーを返します。を使用して古い動作を取得できます。このメソッドは、正常に解析された部分文字列の範囲を返します。YESgetObjectValue:forString:range:error:

numberFromString:が上記の方法で実装されていて、iOS 3.2NSNumberFormatterが 10.5 ベースであるのに対し、iOS 4 バージョンが 10.6であっても、まったく驚かないでしょう。

私の推測です。

iOS 3.2 で 1/1/2010 を渡すと、1 が解析され、残りは無視されます。2010 年 2 月 1 日を通過したときに 2 になるかどうかを確認することで、仮説をテストできます。

回避策は、を使用することのようですgetObjectValue:forString:range:error:

于 2010-11-04T09:12:49.877 に答える
1

基本[str intValue]が効かないのでは?いや[scanner scanInt:&int]

の使用についてはどうですかNSCharacterSet、つまり:

NSString *test = [str stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
if ([test length]) @throw ...;
return [str intValue];
于 2010-11-04T01:01:42.737 に答える