Di bawah ini adalah bagaimana saya sebelumnya akan memotong float ke dua tempat desimal
NSLog(@" %.02f %.02f %.02f", r, g, b);
Saya memeriksa dokumen dan eBuku tetapi belum dapat menemukannya. Terima kasih!
Solusi terbaik saya sejauh ini, mengikuti tanggapan David :
import Foundation
extension Int {
func format(f: String) -> String {
return String(format: "%\(f)d", self)
}
}
extension Double {
func format(f: String) -> String {
return String(format: "%\(f)f", self)
}
}
let someInt = 4, someIntFormat = "03"
println("The integer number \(someInt) formatted with \"\(someIntFormat)\" looks like \(someInt.format(someIntFormat))")
// The integer number 4 formatted with "03" looks like 004
let someDouble = 3.14159265359, someDoubleFormat = ".3"
println("The floating point number \(someDouble) formatted with \"\(someDoubleFormat)\" looks like \(someDouble.format(someDoubleFormat))")
// The floating point number 3.14159265359 formatted with ".3" looks like 3.142
Saya pikir ini adalah solusi yang paling Swift, mengikat operasi pemformatan langsung ke tipe data. Mungkin ada pustaka operasi pemformatan di suatu tempat, atau mungkin akan segera dirilis. Ingatlah bahwa bahasanya masih dalam versi beta.
cara sederhana adalah:
sumber
println(String(format: "a float number: %.5f", 1.0321))
printf
tanpa harus menulis ekstensi terpisah.import Foundation
Saya menemukan
String.localizedStringWithFormat
bekerja dengan baik:Contoh:
sumber
Ini adalah cara yang sangat cepat dan sederhana yang tidak membutuhkan solusi yang rumit.
sumber
Col 16: 'init' has been renamed to 'init(describing:)'
Sebagian besar jawaban di sini valid. Namun, jika Anda akan sering memformat angka, pertimbangkan untuk memperluas kelas Float untuk menambahkan metode yang mengembalikan string yang diformat. Lihat contoh kode di bawah ini. Yang ini mencapai tujuan yang sama dengan menggunakan pemformat angka dan ekstensi.
Konsol menunjukkan:
Pembaruan SWIFT 3.1
sumber
NSNumberFormatter
, seperti jawaban ini. Jawaban dengan suara sangat tinggi lainnya hanya gagal mencerminkan pengaturan lokal perangkat (misalnya di beberapa lokal, mereka menggunakan koma untuk tempat desimal; ini mencerminkan bahwa; jawaban lain tidak).NSNumberFormatter
cukup lambat untuk diinisialisasi. Jika memungkinkan, ada baiknya untuk mendefinisikan dan menggunakannya kembali. Yang mengatakan, saya di sini membaca pertanyaan ini karena itu tidak mungkin dalam kasus saya.Anda tidak dapat melakukannya (belum) dengan interpolasi string. Taruhan terbaik Anda masih berupa pemformatan NSString:
Mengekstrapolasi dari python, sepertinya sintaks yang masuk akal adalah:
Yang kemudian memungkinkan Anda untuk menggunakannya sebagai:
Anda dapat menentukan operator serupa untuk semua jenis numerik, sayangnya saya belum menemukan cara untuk melakukannya dengan obat generik.
Pembaruan Swift 5
Pada setidaknya Swift 5,
String
secara langsung mendukungformat:
penginisialisasi, sehingga tidak perlu menggunakanNSString
dan@infix
atribut tidak lagi diperlukan yang berarti sampel di atas harus ditulis sebagai:sumber
[NSString stringWithFormat...
Mengapa membuatnya begitu rumit? Anda bisa menggunakan ini sebagai gantinya:
Lihat itu berfungsi di Playground.
PS: Solusi dari: http://rrike.sh/xcode/rounding-various-decimal-places-swift/
sumber
Pemakaian
sumber
Solusi yang lebih elegan dan generik adalah menulis ulang
%
operator ruby / python :sumber
"Hello %@, This is pi : %.2f" % ["World", M_PI]
berfungsi, tapi anehnya"%@ %@" % ["Hello", "World"]
menaikkancan't unsafeBitCast
... Tebak itu akan diperbaiki di versi berikutnya.,
bukan operator karakter yang valid, dalam bahasa Swift dan sebagian besar bahasa. Dan imo, lebih baik menggunakan%
operator yang sudah ada dalam bahasa lain. Lihat developer.apple.com/library/ios/documentation/Swift/Conceptual/…Cepat 4
sumber
Anda masih dapat menggunakan NSLog di Swift seperti pada Objective-C hanya tanpa tanda @.
Sunting: Setelah bekerja dengan Swift sejak beberapa saat saya ingin menambahkan variasi ini juga
Keluaran:
sumber
Detail
Solusi 1
func rounded () -> Double
func rounded (_ rule: FloatingPointRoundingRule) -> Dobel
mutating func round ()
mutating func round (_ rule: FloatingPointRoundingRule)
Solusi 2
Pemakaian
Sampel lengkap
Keluaran
sumber
sumber
Jawaban yang diberikan sejauh ini yang telah menerima suara terbanyak bergantung pada metode NSString dan akan mengharuskan Anda telah mengimpor Foundation.
Namun, setelah melakukan itu, Anda masih memiliki akses ke NSLog.
Jadi saya pikir jawaban untuk pertanyaan, jika Anda bertanya bagaimana untuk terus menggunakan NSLog di Swift, cukup:
import Foundation
sumber
sumber
di sini solusi cepat "murni"
sumber
Kekuatan ekstensi
Output: Kecepatannya 12,3
sumber
cara mengetik kurang:
sumber
Anda juga dapat membuat operator dengan cara ini
sumber
Juga dengan pembulatan:
sumber
gunakan metode di bawah ini
sumber
Versi operator ruby / python% Vincent Guerci, diperbarui untuk Swift 2.1:
sumber
Banyak jawaban bagus di atas, tetapi kadang-kadang sebuah pola lebih sesuai daripada jenis gobbledygook "% .3f". Inilah pendapat saya menggunakan NumberFormatter di Swift 3.
Di sini saya ingin 2 desimal selalu ditampilkan, tetapi yang ketiga hanya jika bukan nol.
sumber
Pembaruan Swift 4 Xcode 10
sumber
Bagaimana dengan ekstensi pada tipe Double dan CGFloat:
Pemakaian:
cetakan: 112 465 848 348 508,46
sumber
sumber
Saya tidak tahu tentang dua tempat desimal, tetapi inilah cara Anda dapat mencetak mengapung dengan nol tempat desimal, jadi saya bayangkan itu bisa menjadi 2 tempat, 3, tempat ... (Catatan: Anda harus mengonversi CGFloat ke Double untuk lulus ke String (format :) atau akan melihat nilai nol)
sumber
Contoh Swift2: Lebar layar perangkat iOS yang memformat Float menghapus desimal
sumber
@Christian Dietrich:
dari pada:
bisa juga:
[koreksi:] Maaf untuk kebingungan * - Tentu saja ini berfungsi dengan Doubles. Saya pikir, yang paling praktis (jika Anda ingin angka dibulatkan, tidak dipotong) itu akan seperti itu:
Untuk Float saja, cukup ganti Double dengan Float, pow dengan powf dan bulat dengan roundf.
Pembaruan: Saya menemukan bahwa paling praktis untuk menggunakan tipe return Double daripada String. Ini berfungsi sama untuk output String, yaitu:
cetakan: Pi kira-kira 3,142
Jadi Anda dapat menggunakannya dengan cara yang sama untuk Strings (Anda bahkan masih dapat menulis: println (d ~> 2)), tetapi selain itu Anda juga dapat menggunakannya untuk membulatkan nilai secara langsung, yaitu:
atau apapun yang kamu butuhkan ...
sumber
menggunakan
atau
sumber