2009-11-17 3 views

Antwort

23

Ich habe vor kurzem entdeckte diese Einzeiler:

[@1234567 descriptionWithLocale:[NSLocale currentLocale]]; // 1,234,567 

Oder in Swift 2:

1234567.descriptionWithLocale(NSLocale.currentLocale())  // 1,234,567 

Swift 3/4:

(1234567 as NSNumber).description(withLocale: Locale.current) 

pro Frage Formatiert:

[@(n) descriptionWithLocale:[NSLocale currentLocale]]; 

ohne Literale Objective-C Formatiert:

[[NSNumber numberWithInt:n] descriptionWithLocale:[NSLocale currentLocale]]; 

Dies ist die Lösung, die ich suchte, als ich die Frage gestellt. Verfügbar seit iOS 2.0 und OS X 10.0, dokumentiert, um eine Zeichenfolgenversion der gemäß dem angegebenen Gebietsschema formatierten Zahl zurückzugeben.stringValue ist sogar dokumentiert, diese Methode zu verwenden, aber nil übergeben.

Da es meine Frage ist und dies meiner Antwort am besten entspricht, bin ich versucht, die Ticks zu ändern, aber es scheint grausam. Update Ich habe das Häkchen geändert, diese Antwort lautet die Antwort.

0

Verwenden Sie eine NSNumberFormatter.

+0

Der einfachste Weg, dies zu tun ist '[NSString stringWithFormat: @"% d doodads ", [[[NSNumberFormatter allocation] Autorelease) stringFromNumber: n]]];'? Wie das ist ausführlicher als ich gehofft hatte. – mxcl

+0

Max Howell: Normalerweise würden Sie an dem Zahlenformatierer in einer Instanzvariable festhalten (die Sie eine Steckdose machen können, um den Formatierer in einer Schreibfeder zu halten), was den Ausdruck einfach '' myFormatter stringFromNumber: [NSNummer numberWithInt: n] ] '. (Außerdem sollten Sie 'NSInteger' und' numberWithInteger: ', nicht' int' und 'numberWithInt:' verwenden, um die größere Reichweite auf 64-Bit-Rechnern zu nutzen.) –

+0

Ich kann das nicht zum Laufen bringen. Auch mit setHasThousandSeparators: YES ändert nichts - keine tausend Trennzeichen. – mxcl

50

Für 10.6 dies funktioniert:

NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4]; 
[numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; 
NSString *numberString = [numberFormatter stringFromNumber: [NSNumber numberWithInteger: i]]; 

Und es Griffe richtig Lokalisierung.

+1

+1 Dies sollte als Antwort ausgewählt werden, da in der ausgewählten Antwort keine Methode setFormat verfügbar ist. –

+0

Apple Docs sagen 'NSNumberFormatter' hat definitiv eine 'setFormat'-Methode. Ich würde das bevorzugen, aber ich habe es nicht getestet. Ich bin mir sicher, dass es besser ist. – mxcl

25

Die folgende Adresse adressiert nicht das Gebietsschema, aber es ist ein besserer Weg (meiner Meinung nach), das Tausendertrennzeichen auf dem Zahlenformatierer festzulegen.

+1

Schön, wenn es funktioniert, aber das ist ausschließlich englische Formatierung, nicht das Standardgebietsschema der Maschine. – mxcl

+0

Sie können die Locale-Eigenschaft für den NSNumberFormatter – bandejapaisa

+1

festlegen, aber Sie legen das Gruppierungstrennzeichen explizit auf ein Komma. Dies gilt nicht für viele Ländereinstellungen. Außerdem ist die Gruppierungsgröße in allen Gebietsschemas nicht drei. – mxcl

1

Todd Ransom antwortete perfekt.

Ich möchte nur hinzufügen (in einem separaten Kommentar, so dass ich etwas schön formatierten Code anzeigen kann), dass, wenn Sie dies regelmäßig tun möchten, es eine NSString-Hilfsklasse erstellen lohnt.

So schaffen Sie sich eine NSStringHelper.h mit diesem:

#import <Foundation/Foundation.h> 

@interface NSString (NSStringHelper) 

+(NSString*)formatWithThousandSeparator:(NSInteger)number; 

@end 

..und eine NSStringHelper.m Datei mit diesem:

#import "NSStringHelper.h" 

@implementation NSString (NSStringHelper) 

+(NSString*)formatWithThousandSeparator:(NSInteger)number 
{ 
    // Format a number with thousand seperators, eg: "12,345" 
    NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4]; 
    [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; 
    NSString *result = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:number]]; 
    return result; 
} 

@end 

Dies gibt Ihnen die perfekte Möglichkeit, diesen Code wiederverwenden in zukünftigen Projekten.

#import "NSStringHelper.h" 

NSInteger numOfUsers = 12345; 
NSString* strNumberOfUsers = [NSString formatWithThousandSeparator:numOfUsers]; 

Cool, hey?

Noch einmal Entschuldigung für die Rückmeldung von Todds Antwort (die genau das war, wonach ich suchte!), Aber dies ist ein großartiger Weg, das Problem zu lösen und es für zukünftige XCode-Projekte bereit zu haben.

Verwandte Themen