2009-11-17 9 views

Odpowiedz

23

Niedawno odkryliśmy ten jeden-liner:

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

Albo w Swift 2:

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

Swift 3/4:

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

sformatowany za pytaniem:

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

sformatowany bez literałów Objective-C:

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

To rozwiązanie szukałem kiedy zadałem pytanie. Dostępne od wersji iOS 2.0 i OS X 10.0, udokumentowane w celu zwrócenia wersji ciągowej liczby sformatowanej zgodnie z podanymi locale.stringValue jest nawet udokumentowany, że używa tej metody, ale przekazuje nil.

Widząc, jak to jest moje pytanie i to pasuje najlepiej do mojej odpowiedzi, mam ochotę zmienić zaznaczenie, ale wydaje się okrutne. Aktualizacja Zmieniłem zaznaczenie, ta odpowiedź to z odpowiedzią.

0
+0

Tak więc absolutnie najłatwiej to zrobić: '[NSString stringWithFormat: @"% d doodads ", [[[NSNumberFormatter alloc] autorelease] stringFromNumber: n]]];'? Jest to bardziej gadatliwe, niż się spodziewałem. – mxcl

+0

Max Howell: Normalnie trzymalibyście się formatera liczbowego w zmiennej instancyjnej (z której można zrobić wylot, aby zachować formatator w końcówce), co powoduje, że wyrażenie to po prostu '[myFormatter stringFromNumber: [numerNumerWithInt: n] ] '. (Powinieneś też używać 'NSInteger' i' numberWithInteger: ', a nie' int' i 'numberWithInt:', aby wykorzystać większy zasięg na maszynach 64-bitowych). –

+0

Nie mogę tego uruchomić. Nawet użycie setHasThousandSeparators: YES nic nie zmienia - brak separatorów tysięcy. – mxcl

50

10,6 to działa:

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

I to właściwie obsługuje lokalizację.

+1

+1 Ta odpowiedź powinna być wybrana, ponieważ w wybranej odpowiedzi nie ma dostępnej metody setFOrmat. –

+0

Dokumentacja Apple mówi, że 'NSNumberFormatter' zdecydowanie ma metodę' setFormat'. Akceptuję to w pierwszej kolejności, ale nie testowałem tego. Jestem pewien, że jest lepiej. – mxcl

25

Poniższe dane nie odnoszą się do ustawień regionalnych, ale jest lepszym sposobem (moim zdaniem) ustawienia separatora tysięcy w edytorze liczb.

NSNumberFormatter *numberFormat = [[[NSNumberFormatter alloc] init] autorelease]; 
numberFormat.usesGroupingSeparator = YES; 
numberFormat.groupingSeparator = @","; 
numberFormat.groupingSize = 3; 
+1

Przyjemnie, jeśli działa, ale jest to ściśle angielskie formatowanie, a nie domyślne ustawienia regionalne urządzenia. – mxcl

+0

Można ustawić właściwość lokalizacji na NSNumberFormatter – bandejapaisa

+1

Ale jawnie ustawić separator grupowania na przecinek. Nie dotyczy to wielu lokalizacji. Rozmiar grupowania nie wynosi trzech we wszystkich ustawieniach regionalnych. – mxcl

1

Todd Ransom odpowiedział na to doskonale.

Chciałbym tylko dodać (w osobnym komentarzu, żebym mógł pokazać ładnie sformatowany kod), że jeśli planujesz robić to regularnie, warto utworzyć klasę pomocniczą NSString.

Tak, utwórz własne NSStringHelper.h zawierających ten:

#import <Foundation/Foundation.h> 

@interface NSString (NSStringHelper) 

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

@end 

..i plik zawierający ten NSStringHelper.m:

#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 

Daje to doskonały sposób do ponownego użycia tego kodu w przyszłych projektach.

#import "NSStringHelper.h" 

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

Fajnie, hej?

Ponownie przepraszam za odświeżenie odpowiedzi Todda (dokładnie tego szukałem!), Ale jest to świetny sposób na rozwiązanie problemu i przygotowanie go do wykorzystania w przyszłych projektach XCode.

Powiązane problemy