3

'80182916772147201'などの長い長い数値(文字列として受信)をNSNumberに保存しようとしています。

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterBehaviorDefault];

[item setObject:[f numberFromString:@"80182916772147201"] forKey:@"theID"];
[f release];

文字列が「80182916772147201」であると仮定して、これをNSLogアウトすると、次のようになります。

NSLog(@"%lld", [[item objectForKey:@"theID"] longLongValue]); 

戻り値:'80182916772147200'-切り捨てられた最後の桁に注意してください。

私は何が間違っているのですか?

4

2 に答える 2

3

問題は、NSNumberFormatterその数値を浮動小数点数として表すことにしたことです。整数のみを使用するように強制するには:

[f setAllowsFloats:NO];
于 2011-06-13T09:34:42.790 に答える
2

これを試すことができますか?

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

これにより、numStr には数字のみが含まれ、「有効な」unsigned long long 値が含まれるなど、いくつかの合理的な仮定が立てられます。このアプローチの欠点は、UTF8String が本質的に [[numStr dataUsingEncoding:NSUTF8StringEncoding] バイト] に相当するもの、つまり呼び出しごとに自動解放されるメモリの 32 バイトに相当するものを作成することです。ほとんどの場合、これはまったく問題ありません。

unsignedLongLongValue のようなものを NSString に追加する方法の例については、非常に高速であり、副作用として自動解放されたメモリを使用しないため、この SO の質問に対する私の (長い) 回答の最後をご覧ください。具体的には、unsignedLongLongValue を実装するために簡単な変更のみが必要な rklIntValue の実装例です。

于 2011-06-13T09:33:26.910 に答える