3

NSDecimal高精度で大きくなりました。このような:

NSString *decStr = @"999999999999.999999999999";
NSDecimal dec;
NSScanner *scanner = [[NSScanner alloc] initWithString:decStr];
[scanner scanDecimal:&dec];

NSDecimalNumber *decNum = [[NSDecimalNumber alloc] initWithDecimal:*dec];

NSDecimalこれで my の文字列表現を簡単に取得できます。

NSString *output = [decNum stringValue];

または

NSString *output = [decNum descriptionWithLocale:nil];

ただし、画面に出力するために正しくフォーマットされることはありません。

output = 999999999999.999999999999

999,999,999,999.999999999999 のようにグループ分けしたい

だから私は試しましたNSNumberFormatter

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setAllowsFloats:YES];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:kCFNumberFormatterDecimalStyle];

NSString *output = [formatter stringFromNumber:resultDecNum];

それはこれで終わります:

output = 1,000,000,000,000

NSDecimal精度を失うことなく、ユーザーのロケールに基づいて正しくフォーマットされた大きな高精度を取得する方法はありますか?

4

1 に答える 1

1

すでにお気づきのように、NSNumberFormatterはfloatに変換されます。残念ながら、代わりにdescriptionWithLocaleしかありません。これは、必要な動作を変更する方法を提供しません。最善の方法は、独自のフォーマッタを作成することです。Appleはそのためのガイドも提供しています。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/DataFormatting.html

descriptionWithLocaleを開始点として、セパレーターを探します。次に、その前に3桁ごとにコマを追加します。

編集:

もう1つのアイデアは、文字列を整数部分とセパレータの背後にあるものに分割し、フォーマッタを使用して整数部分をフォーマットし、その後、残りの部分と結合することです。

// Get the number from the substring before the seperator 
NSString *output = [number descriptionWithLocale:nil];
NSNumber *integerPartOnly = [NSNumber numberWithInt:[output intValue]];

// Format with decimal separators
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:kCFNumberFormatterDecimalStyle];

NSString *result = [formatter stringFromNumber:integerPartOnly]

// Get the original stuff from behind the separator
NSArray* components = [output componentsSeparatedByString:@"."];
NSString *stuffBehindDot = ([components count] == 2) ? [components objectAtIndex: 1] : @"";

// Combine the 2 parts
NSString *result = [result stringByAppendingString:stuffBehindDot];
于 2012-03-29T10:13:56.783 に答える