Buat float hanya menampilkan dua tempat desimal

296

Saya memiliki nilai 25.00dalam a float, tetapi ketika saya mencetaknya di layar itu 25.0000000.
Bagaimana saya bisa menampilkan nilai hanya dengan dua tempat desimal?

mskfisher
sumber
var nf = NSNumberFormatter () nf.positiveFormat = "0. ##" var numberAfterRound = nf.stringFromNumber (NSNumber (dua kali: angka))!
kalpeshdeo

Jawaban:

648

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];

%.02fmemberitahu formatter bahwa Anda akan memformat float ( %f) dan, yang harus dibulatkan ke dua tempat, dan harus diisi dengan 0s.

Misalnya:

%f = 25.000000
%.f = 25
%.02f = 25.00
Andrew Grant
sumber
7
Saya perhatikan bahwa menggunakan% .2f sebenarnya mengembalikan 25.00 dalam contoh Anda dan bukan 25. Ini aneh.
fulvio
3
Cara saya selalu mengerti adalah bahwa angka setelah titik desimal mengatakan berapa banyak desimal yang Anda dapatkan. Jadi, .2f akan memberikan 25.00, dan .4f akan memberikan 25.0000.
Erik S
3
Jika ada yang ingin tahu bagaimana seseorang benar - benar mendapatkan25 .. @"%.f"melakukan trik. Apa yang tertulis di atas, tidak .
Alex Gray
4
@ acapapades, jika Anda menggunakan@"%.*f", decimalPlaces, number
Jonathan.
12
Mungkin ini akan menjadi off-topic parsial tapi saya akan menambahkan format lain:%03.f = 025
SoftDesigner
197

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...

Vaibhav Saran
sumber
Apakah yang terakhir akurat? @ "%. 03f" = 3145.566? Bagaimana Anda mendapatkan 0,566 bukannya 0,560?
pixelfreak
dapatkah bilangan bulat yang menentukan jumlah tempat desimal menjadi variabel? seperti @ "%. xf" di mana x bisa berupa bilangan bulat?
acecapades
Jika Anda mengalami masalah dengan @ "%. F" maka coba @ "%. 0f". Saya menemukan ini bekerja untuk tidak mendapatkan tempat desimal di mana yang lain tidak
simon_smiley
1
Adakah yang bisa memberi tahu saya mengapa Anda menggunakan% .02f, bukan hanya% .2f?
hinterbu
20

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.

Rick
sumber
Anda memerlukan float ini numTwoDecimalDigits = atof ([s UTF8String]);
loretoparisi
10

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
codingrhythm
sumber
Solusi ini juga tampaknya berfungsi dengan CGFloat. Luar biasa!
eonist
Ini yang saya cari. Terima kasih sobat!
Tushar Katyal
9

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))
imti
sumber
3

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);
Pablo Santa Cruz
sumber
3

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.

ztalbot
sumber
1

dalam obyektif -c adalah Anda ingin menampilkan nilai float dalam 2 angka desimal kemudian memberikan argumen yang menunjukkan berapa banyak angka desimal yang ingin Anda tampilkan misalnya 0,02f akan mencetak 25,00 0,002f akan mencetak 25.000

shaunak
sumber
1

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)

Ryan
sumber
Itu solusi yang sangat bagus, terima kasih banyak. Bisakah Anda jelaskan bagaimana cara kerjanya? Saya melihat Anda telah menambahkan simbol '%' tambahan.
Eugene Alexeev
1

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

Aks
sumber
1
@Unknown downvoter ini adalah solusi untuk swift & juga berbeda dari jawaban lain untuk swift jadi mengapa?
Aks
jika Anda dapat mengembalikan float, Anda selalu dapat mengubahnya menjadi CGFloat
eonist
1

Gunakan NSNumberFormatterdengan maximumFractionDigitsseperti di bawah ini:

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

Dan Anda akan mendapatkannya 12.35

Allen Huang
sumber
0

Jika Anda perlu mengapung nilai juga:

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