2009-02-08 21 views
10

Używam następujący fragment kodu Objective-C do sformatowania NSNumber i działa dobrze przez większość czasu, ale nie całkiem robi to, co chcę, gdy obiekt NSNumber posiada liczbę całkowitą (bez części ułamkowej) .Jak określić miejsca dziesiętne podczas formatowania obiektów NSNumber?

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)]; 
label.backgroundColor = [UIColor clearColor]; 
label.textColor = [UIColor whiteColor]; 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setFormat:@"###.##"]; 
int bytes = 1024 * 1024; 
NSNumber *total = [NSNumber numberWithFloat:([self.totalFileSize floatValue]/bytes)]; 
label.text = [NSString stringWithFormat:@"0.00 MB of %@ MB", [formatter stringFromNumber:total]]; 

Tak na przykład, jeśli self.totalFileSize posiada 55.2300, to pojawi się "55.23" jak powinno na moim UILabel. Ale jeśli ta sama zmienna ma 55, po prostu wyświetli "55" na etykiecie.

Czego naprawdę chcę, aby ten kod zawsze zawierał 2 miejsca dziesiętne na wyjściu.

Jak mogę to osiągnąć?

Odpowiedz

16

Twój ciąg formatu powinien mieć "0" dla każdego miejsca po przecinku, które chcesz zawsze istnieć.

[formatter setFormat:@"###.00"]; 

dla "55.23" i "i" .23" .20"

[formatter setFormat:@"##0.00"]; 

o "55.23" i "0,23" i "0,20"

Patrz Number Format String Syntax (Mac OS X Versions 10.0 to 10.3)

Możesz też użyć formatyzatora 10.4 z - setMinimumFractionDigits: i - setMaximumFractionDigits: z obydwoma ustawionymi na 2.

+5

setFormat: Nie jest dostępny dla systemu iOS (może działać w symulatorze, ale nie na urządzeniu). Musisz użyć setPositiveFormat: i setNegativeFormat: –

+0

na iOS, musisz użyć 'setMinimumFractionDigits:' i/lub - 'setMaximumFractionDigits:' – Laszlo

7

Wierzę, czego szukasz to: „% .2f”

najgorszy scenariusz, można podzielić wartość, należy sprawdzić, czy jest coś po przecinku. Jeśli nie dodasz 00 ręcznie?

+1

Wierzę w co masz na myśli wierzysz, czego szuka: "% .2f";) – schnaader

+0

Użycie tego nie zrobi tego, co myślisz, ponieważ przekazanie obiektu NSNumber do NSLog spowoduje wywołanie go [obj opis], który zwraca ciąg znaków . W każdym razie staram się unikać hacków takich jak "dopisz 00, jeśli go tam nie ma". Jestem pewien, że NSNumberFormatter ma funkcję do robienia tego, co chcę tutaj. – jpm

+0

@ Greret, byłem zdesperowany, aby znaleźć to proste rozwiązanie. Formatowanie liczb nie jest łatwe. Dzięki. – JFS

3

może być lepiej z localizedStringWithFormat, tak jak ...

[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)]; 
label.backgroundColor = [UIColor clearColor]; 
label.textColor = [UIColor whiteColor]; 
int bytes = 1024 * 1024; 
label.text = [NSString localizedStringWithFormat:@"0.00 MB of %.2f MB", ([self.totalFileSize floatValue]/bytes)]; 

I oczywiście bajtów może być const unsigned i clearColor bywa wieprz wydajność, ale te są problemy z innym wątkiem.

+0

Jaki jest problem z używaniem 'clearColor' i co byłoby lepsze? Dziękuję bardzo! – JFS

+0

dzięki za wskazówkę 'localizedStringWithFormat'. Rozpaczliwie szukałem łatwego sposobu na zapewnienie zlokalizowanego separatora dziesiętnego. – JFS

Powiązane problemy