2009-07-11 18 views
18

Jak mogę osiągnąć następujące konwersję z podwójnym na ciąg znaków:Limit podwójną dokładnością do dwóch miejsc po przecinku

1.4324 => "1.43" 
9.4000 => "9.4" 
43.000 => "43" 

tj Chcę zaokrąglić do do miejsc po przecinku, ale nie chcesz wszelkie końcowe zera, czyli nie chcę

9.4 => "9.40" (wrong) 
43.000 => "43.00" (wrong) 

Więc ten kod, który mam teraz nie działa, gdyż wyświetla nadmiar zer:

[NSString stringWithFormat: @"%.2f", total] 
+1

to nie jest duplikatem http://stackoverflow.com/questions/4985791/round-double-value-to-2-decimal-places więc myślę, że powinno być nieoznaczone jako duplikować. To pytanie dotyczy sposobu ograniczenia do * maksymalnej * dwóch miejsc po przecinku, podczas gdy inne pytanie brzmi: jak ograniczyć * zawsze * dwa miejsca po przecinku. To ostatnie jest łatwe i już wspomniano w pierwotnym pytaniu. –

+0

To nie jest duplikat. Ktoś po prostu podekscytowany swoimi mocami. – Jacob

Odpowiedz

1

Nie jestem zaznajomiony z celem C, ale nie jest to możliwe przy standardowym formatowaniu w stylu printf.

Użycie% g spowodowałoby sortowanie, ale w przypadku dużych i małych liczb użyłoby notacji naukowej (np. 9,6e + 6, 4.2e-7) zamiast zapisu dziesiętnego.

The equivalent question was asked for C/C++ here, w takim przypadku odpowiedzią jest użycie% f, a następnie usunięcie wszelkich ciągłych zer z ciągu. Niezupełnie elegancki.

+0

Hej, to była moja odpowiedź, którą nazywasz nieelegancką :-) W rzeczywistości jest dużo bardziej elegancka w Objective-C, ponieważ łańcuchy są w rzeczywistości łańcuchami, a nie tablicami char z wszystkimi ich słabostkami. – paxdiablo

4

Najprostszym sposobem jest prawdopodobnie samodzielne rzucenie. Musiałem to zrobić w C wcześniej, ponieważ nie ma sposobu, aby uzyskać pożądane zachowanie z formatowaniem printf.

Wygląda na to, że nie jest to dużo łatwiejsze w Objective-C. Dałbym to spróbować:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total]; 
while ([ftotal hasSuffix:@"0"]) { 
    ftotal = [ftotal subStringToIndex [ftotal length]-1]; 
} 
if ([ftotal hasSuffix:@"."]) { 
    ftotal = [ftotal subStringToIndex [ftotal length]-1]; 
} 

czy to (być może szybciej) Wariant:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total]; 
if ([ftotal hasSuffix:@".00"]) { 
    ftotal = [ftotal subStringToIndex [ftotal length]-3]; 
} else { 
    if ([ftotal hasSuffix:@"0"]) { 
     ftotal = [ftotal subStringToIndex [ftotal length]-1]; 
    } 
} 

The stringWithFormat gwarancji nie zawsze będzie ".nn" na końcu (gdzie n jest cyfrą znaków) . while i if po prostu usuwają końcowe zera i końcowe dziesiętne, jeśli jest to liczba całkowita.

Oczywiście możesz umieścić go w funkcji lub klasie, dzięki czemu możesz uzyskać do niego dostęp z dowolnego miejsca, bez konieczności duplikowania kodu w całym miejscu.

-2

Jestem całkiem pewny, że [[NSNumber numberWithFloat: f] stringValue] robi dokładnie to, co chcesz.

35

Popełniłeś prosty błąd. To będzie działać:

[NSString stringWithFormat: @"%.2lf", total] 
+7

To działa, ale jak? – Beniamin

Powiązane problemy