5

Znalazłem% g, aby pokazać w razie potrzeby tylko miejsca dziesiętne. Jeśli liczba jest całkowita, nie dodaje się końcowego .000, więc to dobrze. Ale w przypadku np. 1.12345 chcę, aby skrót odpowiedzi na 1.123. A w przypadku 1.000 chcę pokazać tylko 1, tak jak już% g.Prawidłowe użycie specyfikatora formatu, aby wyświetlić maksymalnie trzy miejsca po przecinku, jeśli jest to konieczne, inaczej zero miejsca dziesiętne?

Próbowałem podać% .3g w ciągu znaków, ale to nie działa. Jeśli ktoś ma odpowiedź, byłbym wdzięczny!

Odpowiedz

2

Co otrzymasz za NSLog (@ "% .3g", 1.12345)?

Zrobiłem kilka testów i jak rozumiem twoje pytanie, jesteś na dobrej drodze. Oto moje wyniki:

NSLog(@"%g", 1.000000); => 1 
NSLog(@"%g", 1.123456789); => 1.12346 
NSLog(@"%.1g", 1.123456789); => 1 
NSLog(@"%.2g", 1.123456789); => 1.1 
NSLog(@"%.3g", 1.123456789); => 1.12 
NSLog(@"%.4g", 1.123456789); => 1.123 

Aby uzyskać to, czego chcesz, użyj @ "% .4g".

+1

Dziękuję za odpowiedź, ale to nadal nie działa poprawnie. –

+1

% .3g nie będzie pokazywać pół dużych liczb, jako 100 000. To zostanie wydrukowane jako 1E + 05, co nie jest idealne: D % .3f wydaje się pasować najlepiej, ale to zawsze pozostawia końcowe zera, gdy na liczbę całkowitą ? .. :( –

+0

jak dostanę 123456.1234 wydrukowany jako 123456.12, jak również 123456.00 wydrukowany jako 123456 dwóch miejsc po przecinku, tylko w razie potrzeby .. –

11

Sprawdziłem możliwości "łańcucha formatu" przez IEEE Specification i jak rozumiem, twoje pożądane zachowanie nie jest możliwe.

Polecam, aby użyć klasy NSNumberFormatter. Napisałem przykład pasujący do twojego pożądanego zachowania. Mam nadzieję, że pomaga:

NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[numberFormatter setMaximumFractionDigits:2]; 
[numberFormatter setDecimalSeparator:@"."]; 
[numberFormatter setGroupingSeparator:@""]; 
NSString *example1 = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:123456.1234]]; 
NSLog(@"%@", example1); 
NSString *example2 = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:123456.00]]; 
NSLog(@"%@", example2); 
+0

Jan Weinkauff - Dziękuję tyle niesamowite, że są ludzie wokół jak! Ty, chcąc wykorzystać swój czas, aby znaleźć odpowiedzi dla innych! –

+0

+1 do badania specyfikacji IEEE. –

0

Oto rozwiązanie dla Swift Jana 4:

let numberFormatter = NumberFormatter() 
numberFormatter.numberStyle = .decimal 
numberFormatter.maximumFractionDigits = 2 
numberFormatter.decimalSeparator = "." 
numberFormatter.groupingSeparator = "" 
let example1 = numberFormatter.string(from: 123456.1234)! 
print(example1) 
let example2 = numberFormatter.string(from: 123456.00)! 
print(example2)