2012-03-23 12 views
6

Chciałbym, aby jeden z moich UILabeli pokazywał maksymalnie 3 cyfry. Tak więc, jeśli powiązana wartość wynosi 3.224789, chciałbym zobaczyć 3.22. Jeśli wartość wynosi 12,563, chciałbym zobaczyć 12.5, a jeśli wartość to 298,33912, to chciałbym zobaczyć 298. Próbowałem użyć NSNumberFormatter, aby to osiągnąć, ale kiedy ustawiam maksymalne cyfry znaczące na 3. zawsze ma 3 cyfry po przecinku. Oto kod:NSNumberFormatter, aby wyświetlić maksymalnie 3 cyfry

NSNumberFormatter *distanceFormatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[distanceFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[distanceFormatter setAlwaysShowsDecimalSeparator:NO]; 
[distanceFormatter setMaximumSignificantDigits:3]; 

Zawsze myślałem „cyfry znaczące” oznaczało wszystkie cyfry, przed i po przecinku. W każdym razie, jest sposób na dokonanie tego przy użyciu NSNumberFormatter?

Dzięki!

Odpowiedz

10

Wierzę, że

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
formatter.usesSignificantDigits = YES; 
formatter.maximumSignificantDigits = 3; 

zrobi dokładnie to, co chcesz, tzn. Zawsze będzie wyświetlać dokładnie 3 cyfry, czy to 2 przed separatorem dziesiętnym i 1 po lub 1 przed separatorem dziesiętnym i 2 po.

+1

Tak, to działa świetnie. Ustawienie znacznika 'usesSignificantDigits' na YES jest kluczem do tego rozwiązania dla PO. Po prostu użyłem tego i faktycznie działa on po przecinku, na przykład przelicza 19,17 na 19,20 $. –

+0

proszę sprawdzić moje pytanie http://stackoverflow.com/questions/35112206/how-to-show-only-first-two-numbers-in-nsnumberformatter. To nie działa dla mnie w Swift – Alexander

2

Herezje mała funkcja pisałem:

int nDigits(double n) 
{ 
    n = fabs(n); 
    int nDigits = 0; 
    while (n > 1) { 
     n /= 10; 
     nDigits++; 
    } 

    return nDigits; 
} 

NSString *formatNumber(NSNumber *number, int sigFigures) 
{ 
    double num = [number doubleValue]; 
    int numDigits = nDigits(num); 

    NSString *format = [NSString stringWithFormat:@"%%%i.%ilf", sigFigures -= numDigits, sigFigures]; 

    return [NSString stringWithFormat:format, num]; 
} 

W moich testach, to działało w porządku.

+0

Dzięki za zrozumienie pytania. Istnieje różnica między "cyframi znaczącymi" i "cyframi po prawej stronie separatora dziesiętnego". –

4

Być może trzeba także ustawić (nie wiem, chociaż):

[distanceFormatter setUsesSignificantDigits: YES];

Ale w twoim przypadku to chyba o wiele łatwiej jest po prostu użyć standardowego formatowania wyrażenie:

CGFloat yourNumber = ...; 
NSString* stringValue = [NSString stringWithFormat: @"%.3f", yourNumber]; 

(uwaga : to zaokrągli ostatnią cyfrę)

Powiązane problemy