Saya memiliki nilai 25.00
dalam a float
, tetapi ketika saya mencetaknya di layar itu 25.0000000
.
Bagaimana saya bisa menampilkan nilai hanya dengan dua tempat desimal?
Saya memiliki nilai 25.00
dalam a float
, tetapi ketika saya mencetaknya di layar itu 25.0000000
.
Bagaimana saya bisa menampilkan nilai hanya dengan dua tempat desimal?
Jawaban:
Ini bukan masalah bagaimana nomor itu disimpan, itu adalah masalah bagaimana Anda menampilkannya. Saat mengubahnya menjadi string, Anda harus membulatkan ke presisi yang diinginkan, yang dalam kasus Anda adalah dua tempat desimal.
Misalnya:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
%.02f
memberitahu formatter bahwa Anda akan memformat float ( %f
) dan, yang harus dibulatkan ke dua tempat, dan harus diisi dengan 0
s.
Misalnya:
%f = 25.000000
%.f = 25
%.02f = 25.00
25
.. @"%.f"
melakukan trik. Apa yang tertulis di atas, tidak .
@"%.*f", decimalPlaces, number
%03.f = 025
Berikut adalah beberapa koreksi-
//for 3145.559706
Cepat 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"
dan seterusnya...
Anda juga dapat mencoba menggunakan NSNumberFormatter:
NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.##";
NSString* s = [nf stringFromNumber: [NSNumber numberWithFloat: myFloat]];
Anda mungkin perlu juga mengatur format negatif, tapi saya pikir itu cukup pintar untuk mengetahuinya.
Saya membuat ekstensi cepat berdasarkan jawaban di atas
extension Float {
func round(decimalPlace:Int)->Float{
let format = NSString(format: "%%.%if", decimalPlace)
let string = NSString(format: format, self)
return Float(atof(string.UTF8String))
}
}
pemakaian:
let floatOne:Float = 3.1415926
let floatTwo:Float = 3.1425934
print(floatOne.round(2) == floatTwo.round(2))
// should be true
Dalam Bahasa Swift, jika Anda ingin menunjukkan, Anda perlu menggunakannya dengan cara ini. Untuk menetapkan nilai ganda di UITextView, misalnya:
let result = 23.954893
resultTextView.text = NSString(format:"%.2f", result)
Jika Anda ingin tampil dalam LOG seperti objektif-c menggunakan NSLog (), maka dalam Bahasa Swift Anda dapat melakukannya dengan cara ini:
println(NSString(format:"%.2f", result))
DI objektif-c, jika Anda berurusan dengan array char biasa (bukan pointer ke NSString) Anda juga bisa menggunakan:
printf("%.02f", your_float_var);
OTOH, jika yang Anda inginkan adalah menyimpan nilai itu pada array char yang bisa Anda gunakan:
sprintf(your_char_ptr, "%.02f", your_float_var);
Masalah dengan semua jawaban adalah mengalikan dan kemudian membagi hasil dalam masalah presisi karena Anda menggunakan pembagian. Saya belajar ini sejak lama dari pemrograman pada PDP8. Cara mengatasinya adalah:
return roundf(number * 100) * .01;
Jadi 15.6578 mengembalikan hanya 15.66 dan bukan 15.6578999 atau sesuatu yang tidak diinginkan seperti itu.
Tingkat presisi yang Anda inginkan terserah Anda. Hanya saja, jangan membagi produk, kalikan dengan desimal yang setara. Tidak diperlukan konversi String lucu.
Berikut beberapa metode untuk memformat secara dinamis sesuai dengan presisi:
+ (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;
}
}
misalnya
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:4];
=> 2.3453
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:0];
=> 2
[TSPAppDelegate stringByFormattingString:@"2.346324" toPrecision:2];
=> 2.35 (pembulatan ke atas)
Metode lain untuk Swift (tanpa menggunakan NSString):
let percentage = 33.3333
let text = String.localizedStringWithFormat("%.02f %@", percentage, "%")
PS solusi ini tidak bekerja dengan tipe CGFloat yang hanya diuji dengan Float
&Double
Gunakan NSNumberFormatter
dengan maximumFractionDigits
seperti di bawah ini:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 2;
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:12.345]]);
Dan Anda akan mendapatkannya 12.35
Jika Anda perlu mengapung nilai juga:
NSString* formattedNumber = [NSString stringWithFormat:@"%.02f", myFloat];
float floatTwoDecimalDigits = atof([formattedNumber UTF8String]);
lblMeter.text=[NSString stringWithFormat:@"%.02f",[[dic objectForKey:@"distance"] floatValue]];