Niech liczba zmiennoprzecinkowa pokazuje tylko dwa miejsca dziesiętne

296

Mam wartość 25.00w float, ale kiedy drukuję to na ekranie, jest 25.0000000.
Jak mogę wyświetlić wartość tylko z dwoma miejscami po przecinku?

mskfisher
źródło
var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (double: number))!
kalpeshdeo

Odpowiedzi:

648

To nie jest kwestia sposobu przechowywania numeru, to kwestia sposobu jego wyświetlania. Konwertując go na ciąg, należy zaokrąglić do pożądanej precyzji, która w Twoim przypadku to dwa miejsca po przecinku.

Na przykład:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];

%.02fmówi formatyzatorowi, że sformatujesz zmiennoprzecinkową ( %f) i że należy go zaokrąglić do dwóch miejsc i uzupełnić klawiszem 0s.

Na przykład:

%f = 25.000000
%.f = 25
%.02f = 25.00
Andrew Grant
źródło
7
Zauważyłem, że użycie% .2f faktycznie zwraca 25,00 w twoim przykładzie, a nie 25. To dziwne.
fulvio 11.01.11
3
Zawsze rozumiałem, że liczba po przecinku mówi, ile masz miejsc po przecinku. Tak więc .2f rzeczywiście dałby 25,00, a .4f dałby 25,0000.
Erik S
3
Jeśli ktoś jest ciekawy, jak się to naprawdę dostanie 25 ... @"%.f"robi lewę. To, co napisano powyżej, nie ma .
Alex Gray,
4
@acecapades, jeśli używasz@"%.*f", decimalPlaces, number
Jonathan.
12
Prawdopodobnie będzie to częściowo nie na temat, ale dodałbym inny format:%03.f = 025
SoftDesigner,
197

Oto kilka poprawek

//for 3145.559706

Szybki 3

let num: CGFloat = 3145.559706
print(String(format: "%f", num)) = 3145.559706
print(String(format: "%.f", num)) = 3145
print(String(format: "%.1f", num)) = 3145.6
print(String(format: "%.2f", num)) = 3145.56
print(String(format: "%.02f", num)) = 3145.56 // which is equal to @"%.2f"
print(String(format: "%.3f", num)) = 3145.560
print(String(format: "%.03f", num)) = 3145.560 // which is equal to @"%.3f"

Obj-C

@"%f"    = 3145.559706
@"%.f"   = 3146
@"%.1f"  = 3145.6
@"%.2f"  = 3145.56
@"%.02f" = 3145.56 // which is equal to @"%.2f"
@"%.3f"  = 3145.560
@"%.03f" = 3145.560 // which is equal to @"%.3f"

i tak dalej...

Vaibhav Saran
źródło
Czy ostatni jest dokładny? @ „%. 03f” = 3145.566? Jak zdobyłeś .566 zamiast .560?
pixelfreak
czy liczba całkowita, która określa liczbę miejsc dziesiętnych, może być zmienną? jak @ "%. xf" gdzie x może być dowolną liczbą całkowitą?
acecapades
Jeśli masz problemy z @ "%. F", spróbuj @ "%. 0f". Odkryłem, że zadziałało to, że nie udało się uzyskać miejsc po przecinku, w których drugi nie
simon_smiley,
1
Czy ktoś może mi powiedzieć, dlaczego miałbyś użyć% .02f zamiast tylko% .2f?
hinterbu
20

Możesz także spróbować użyć NSNumberFormatter:

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];

Być może trzeba również ustawić format ujemny, ale myślę, że jest wystarczająco inteligentny, aby to rozgryźć.

Stóg
źródło
potrzebujesz tego float numTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi,
10

Zrobiłem szybkie rozszerzenie w oparciu o powyższe odpowiedzi

extension Float {
    func round(decimalPlace:Int)->Float{
        let format = NSString(format: "%%.%if", decimalPlace)
        let string = NSString(format: format, self)
        return Float(atof(string.UTF8String))
    }
}

stosowanie:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
rytm kodowania
źródło
To rozwiązanie wydaje się również działać z CGFloat. Niesamowite!
eonist
Właśnie tego szukałem. Dzięki stary!
Tushar Katyal
9

W Swift Language, jeśli chcesz pokazać, musisz go używać w ten sposób. Aby przypisać podwójną wartość w UITextView, na przykład:

let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)

Jeśli chcesz wyświetlać w LOG podobnie jak cel c przy użyciu NSLog (), to w Swift Language możesz to zrobić w następujący sposób:

println(NSString(format:"%.2f", result))
imti
źródło
3

W celu-c, jeśli masz do czynienia ze zwykłymi tablicami znaków (zamiast wskaźników do NSString), możesz również użyć:

printf("%.02f", your_float_var);

OTOH, jeśli chcesz przechowywać tę wartość w tablicy char, której możesz użyć:

sprintf(your_char_ptr, "%.02f", your_float_var);
Pablo Santa Cruz
źródło
3

Problem z wszystkimi odpowiedziami polega na tym, że mnożenie, a następnie dzielenie wyników w kwestiach precyzji, ponieważ użyłeś podziału. Nauczyłem się tego dawno temu z programowania na PDP8. Sposobem na rozwiązanie tego jest:

return roundf(number * 100) * .01;

Zatem 15.6578 zwraca tylko 15,66, a nie 15.6578999 lub coś niezamierzonego.

Jaki poziom precyzji zależy od Ciebie. Po prostu nie dziel produktu, pomnóż go przez ekwiwalent dziesiętny. Nie jest wymagana żadna śmieszna konwersja ciągów.

ztalbot
źródło
1

w celu -c chcesz wyświetlić wartość zmiennoprzecinkową w 2 liczbach dziesiętnych, a następnie przekazać argument wskazujący, ile punktów dziesiętnych chcesz wyświetlić, np. 0,02f wydrukuje 25,00 0,002f wydrukuje 25 000

Shaunak
źródło
1

Oto kilka metod dynamicznego formatowania zgodnie z precyzją:

+ (NSNumber *)numberFromString:(NSString *)string
{
    if (string.length) {
        NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
        f.numberStyle = NSNumberFormatterDecimalStyle;
        return [f numberFromString:string];
    } else {
        return nil;
    }
}

+ (NSString *)stringByFormattingString:(NSString *)string toPrecision:(NSInteger)precision
{
    NSNumber *numberValue = [self numberFromString:string];

    if (numberValue) {
        NSString *formatString = [NSString stringWithFormat:@"%%.%ldf", (long)precision];
        return [NSString stringWithFormat:formatString, numberValue.floatValue];
    } else {
        /* return original string */
        return string;
    }
}

na przykład

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];

=> 2,3453

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];

=> 2

[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];

=> 2,35 (zaokrąglenie w górę)

Ryan
źródło
To bardzo dobre rozwiązanie, wielkie dzięki. Czy możesz mi wyjaśnić, jak to działa? Widzę, że dodałeś dodatkowy symbol „%”.
Eugene Alexeev
1

Kolejna metoda dla Swift (bez użycia NSString):

let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")

PS to rozwiązanie nie działa z typem CGFloat przetestowanym tylko z Float&Double

Aks
źródło
1
@ Nieznany downvoter to działa rozwiązanie dla szybkiego, a także różni się od innych odpowiedzi dla szybkiego, więc dlaczego?
Aks
jeśli możesz zwrócić liczbę zmiennoprzecinkową, zawsze możesz przekonwertować ją na CGFloat
eonist
1

Użyj NSNumberFormatterz maximumFractionDigitsjak poniżej:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);

I dostaniesz 12.35

Allen Huang
źródło
0

Jeśli chcesz również zmienić wartość:

NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
loretoparisi
źródło
0
 lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];
Rinju Jain
źródło