Ich habe den Wert 25.00
in a float
, aber wenn ich ihn auf dem Bildschirm drucke, ist es 25.0000000
.
Wie kann ich den Wert mit nur zwei Dezimalstellen anzeigen?
Ich habe den Wert 25.00
in a float
, aber wenn ich ihn auf dem Bildschirm drucke, ist es 25.0000000
.
Wie kann ich den Wert mit nur zwei Dezimalstellen anzeigen?
Antworten:
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];
%.02f
teilt dem Formatierer mit, dass Sie ein float ( %f
) formatieren und, das auf zwei Stellen gerundet und mit 0
s aufgefüllt werden soll .
Z.B:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
funktioniert der Trick. Was oben geschrieben steht, tut es nicht .
@"%.*f", decimalPlaces, number
%03.f = 025
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...
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.
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
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))
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);
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.
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)
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
Verwenden Sie NSNumberFormatter
mit maximumFractionDigits
wie folgt:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
Und du wirst bekommen 12.35
Wenn Sie auch den Wert schweben lassen müssen:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];