Lassen Sie einen Float nur zwei Dezimalstellen anzeigen

296

Ich habe den Wert 25.00in a float, aber wenn ich ihn auf dem Bildschirm drucke, ist es 25.0000000.
Wie kann ich den Wert mit nur zwei Dezimalstellen anzeigen?

mskfisher
quelle
var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (double: number))!
Kalpeshdeo

Antworten:

648

Es geht nicht darum, wie die Nummer gespeichert wird, sondern darum, wie Sie sie anzeigen. Wenn Sie es in eine Zeichenfolge konvertieren, müssen Sie auf die gewünschte Genauigkeit runden, in Ihrem Fall zwei Dezimalstellen.

Z.B:

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

%.02fteilt dem Formatierer mit, dass Sie ein float ( %f) formatieren und, das auf zwei Stellen gerundet und mit 0s aufgefüllt werden soll .

Z.B:

%f = 25.000000
%.f = 25
%.02f = 25.00
Andrew Grant
quelle
7
Ich habe festgestellt, dass die Verwendung von% .2f in Ihrem Beispiel tatsächlich 25,00 und nicht 25 zurückgibt. Das ist seltsam.
Fulvio
3
Ich habe immer verstanden, dass die Zahl nach dem Dezimalpunkt angibt, wie viele Dezimalstellen Sie erhalten haben. Also würde .2f tatsächlich 25.00 geben und .4f würde 25.0000 geben.
Erik S
3
Wenn jemand neugierig ist , wie man sich tatsächlich bekommen 25 .. @"%.f"funktioniert der Trick. Was oben geschrieben steht, tut es nicht .
Alex Gray
4
@acecapades, wenn Sie verwenden@"%.*f", decimalPlaces, number
Jonathan.
12
Wahrscheinlich wird dies ein Teil des Themas sein, aber ich würde ein anderes Format hinzufügen:%03.f = 025
SoftDesigner
197

Hier sind einige Korrekturen

//for 3145.559706

Swift 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"

und so weiter...

Vaibhav Saran
quelle
Ist der letzte richtig? @ "%. 03f" = 3145.566? Wie bist du zu .566 statt .560 gekommen?
Pixelfreak
Kann die Ganzzahl, die die Anzahl der Dezimalstellen bestimmt, eine Variable sein? wie @ "%. xf" wo x kann eine ganze Zahl sein?
Acecapades
Wenn Sie Probleme mit @ "%. F" haben, versuchen Sie @ "%. 0f". Ich fand, dass dies funktionierte, um keine Dezimalstellen zu erhalten, wo die andere nicht
simon_smiley
1
Kann mir jemand sagen, warum Sie% .02f anstelle von nur% .2f verwenden würden?
Hinterbu
20

Sie können auch versuchen, NSNumberFormatter zu verwenden:

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

Möglicherweise müssen Sie auch das Negativformat festlegen, aber ich denke, es ist klug genug, um es herauszufinden.

Rick
quelle
Sie benötigen diesen float numTwoDecimalDigits = atof ([s UTF8String]);
Loretoparisi
10

Ich habe eine schnelle Erweiterung basierend auf den obigen Antworten vorgenommen

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

Verwendung:

let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
Kodierungsrhythmus
quelle
Diese Lösung scheint auch mit CGFloat zu funktionieren. Genial!
Eonist
Das habe ich gesucht. Danke Kumpel!
Tushar Katyal
9

Wenn Sie in Swift Language zeigen möchten, müssen Sie es auf diese Weise verwenden. So weisen Sie UITextView einen doppelten Wert zu:

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

Wenn Sie in LOG wie in Objective-C mit NSLog () anzeigen möchten, können Sie in Swift Language Folgendes tun:

println(NSString(format:"%.2f", result))
imti
quelle
3

In Ziel-c können Sie, wenn Sie mit regulären Zeichen-Arrays (anstelle von Zeigern auf NSString) arbeiten, auch Folgendes verwenden:

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

OTOH, wenn Sie diesen Wert in einem char-Array speichern möchten, können Sie Folgendes verwenden:

sprintf(your_char_ptr, "%.02f", your_float_var);
Pablo Santa Cruz
quelle
3

Das Problem bei allen Antworten ist, dass das Multiplizieren und anschließende Teilen zu Präzisionsproblemen führt, da Sie die Division verwendet haben. Das habe ich vor langer Zeit durch Programmieren auf einem PDP8 gelernt. Der Weg, um dies zu beheben, ist:

return roundf(number * 100) * .01;

Somit gibt 15.6578 nur 15.66 zurück und nicht 15.6578999 oder so etwas Unbeabsichtigtes.

Welche Präzision Sie wünschen, liegt bei Ihnen. Teilen Sie das Produkt nur nicht, sondern multiplizieren Sie es mit dem Dezimaläquivalent. Keine lustige String-Konvertierung erforderlich.

ztalbot
quelle
1

In Ziel -c möchten Sie den Gleitkommawert in einer 2-Dezimalzahl anzeigen und dann ein Argument übergeben, das angibt, wie viele Dezimalstellen Sie anzeigen möchten, z. B. 0,02f wird 25,00 ausgeben. 0,002f wird 25.000 drucken

Shaunak
quelle
1

Hier sind einige Methoden zum dynamischen Formatieren mit einer Genauigkeit:

+ (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;
    }
}

z.B

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

=> 2,3453

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

=> 2

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

=> 2,35 (aufrunden)

Ryan
quelle
Das ist eine sehr gute Lösung, vielen Dank. Können Sie mir erklären, wie es funktioniert? Ich sehe, Sie haben ein zusätzliches '%'-Symbol hinzugefügt.
Eugene Alexeev
1

Eine andere Methode für Swift (ohne Verwendung von NSString):

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

PS Diese Lösung funktioniert nicht mit CGFloat- Typen, die nur mit Float& getestet wurdenDouble

Aks
quelle
1
@ Unbekannter Downvoter Dies ist eine funktionierende Lösung für Swift und unterscheidet sich auch von anderen Antworten für Swift. Warum also?
Aks
wenn Sie einen Schwimmer zurückkehren können Sie jederzeit wandeln es in einem CGFloat
eonist
1

Verwenden Sie NSNumberFormattermit maximumFractionDigitswie folgt:

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

Und du wirst bekommen 12.35

Allen Huang
quelle
0

Wenn Sie auch den Wert schweben lassen müssen:

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