2012-03-29 11 views
3

Ich habe eine große NSDecimal mit hoher Präzision. Wie folgt aus:Wie formatiere ich riesige NSDecimal zu string?

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

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

Ich kann leicht eine String-Darstellung meiner NSDecimal mit dieser bekommen:

NSString *output = [decNum stringValue]; 

Oder

NSString *output = [decNum descriptionWithLocale:nil]; 

Aber es ist nie richtig für die Ausgabe auf dem Bildschirm formatiert:

output = 999999999999.999999999999 

Ich will es Gruppentrennung haben, wie 999,999,999,999.999999999999

So habe ich versucht, ein NSNumberFormatter:

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

NSString *output = [formatter stringFromNumber:resultDecNum]; 

Es endet mit auf den Punkt:

output = 1,000,000,000,000 

Gibt es eine Möglichkeit, eine große hoher Präzision zu erhalten NSDecimal richtig formatiert basierend auf Benutzer Gebietsschema ohne Genauigkeit zu verlieren?

+0

meine Antwort unten mit einer anderen Idee und einigen (ungeprüften) Beispielcode bearbeitet – Thyraz

Antwort

1

Wie Sie bereits bemerkt haben, konvertiert NSNumberFormatter in Float. Leider gibt es nur descriptionWithLocale als eine Alternative, die keine Möglichkeit bietet, das gewünschte Verhalten zu ändern. Der beste Weg, sollten Sie eigene Formatter zu schreiben sein, Apple stellt auch eine Anleitung dafür:

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

Ich würde die descriptionWithLocale als Ausgangspunkt nehmen und für den Separator suchen. Fügen Sie dann comas alle 3 Ziffern vor ihm hinzu.

Edit:

Eine weitere Idee wäre die Zeichenfolge in dem Integer-Teil und das Material hinter dem Separator zu spalten, formatieren Sie den ganzzahligen Teil der Formatierer und es mit dem Rest danach kombinieren.

// 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];