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!
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!
Jawaban:
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:
import Foundation // required for String(format: _, _)
print(String(format: "hex string: %X", 123456))
print(String(format: "a float number: %.5f", 1.0321))
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:
let value: Float = 0.33333
let unit: String = "mph"
yourUILabel.text = String.localizedStringWithFormat("%.2f %@", value, unit)
Ini adalah cara yang sangat cepat dan sederhana yang tidak membutuhkan solusi yang rumit.
let duration = String(format: "%.01f", 3.32323242)
// result = 3.3
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.
extension Float {
func string(fractionDigits:Int) -> String {
let formatter = NSNumberFormatter()
formatter.minimumFractionDigits = fractionDigits
formatter.maximumFractionDigits = fractionDigits
return formatter.stringFromNumber(self) ?? "\(self)"
}
}
let myVelocity:Float = 12.32982342034
println("The velocity is \(myVelocity.string(2))")
println("The velocity is \(myVelocity.string(1))")
Konsol menunjukkan:
The velocity is 12.33
The velocity is 12.3
extension Float {
func string(fractionDigits:Int) -> String {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = fractionDigits
formatter.maximumFractionDigits = fractionDigits
return formatter.string(from: NSNumber(value: self)) ?? "\(self)"
}
}
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:
println(NSString(format:"%.2f", sqrt(2.0)))
Mengekstrapolasi dari python, sepertinya sintaks yang masuk akal adalah:
@infix func % (value:Double, format:String) -> String {
return NSString(format:format, value)
}
Yang kemudian memungkinkan Anda untuk menggunakannya sebagai:
M_PI % "%5.3f" // "3.142"
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 mendukung format:
penginisialisasi, sehingga tidak perlu menggunakan NSString
dan @infix
atribut tidak lagi diperlukan yang berarti sampel di atas harus ditulis sebagai:
println(String(format:"%.2f", sqrt(2.0)))
func %(value:Double, format:String) -> String {
return String(format:format, value)
}
Double.pi % "%5.3f" // "3.142"
[NSString stringWithFormat...
Mengapa membuatnya begitu rumit? Anda bisa menggunakan ini sebagai gantinya:
import UIKit
let PI = 3.14159265359
round( PI ) // 3.0 rounded to the nearest decimal
round( PI * 100 ) / 100 //3.14 rounded to the nearest hundredth
round( PI * 1000 ) / 1000 // 3.142 rounded to the nearest thousandth
Lihat itu berfungsi di Playground.
PS: Solusi dari: http://rrike.sh/xcode/rounding-various-decimal-places-swift/
Solusi yang lebih elegan dan generik adalah menulis ulang %
operator ruby / python :
// Updated for beta 5
func %(format:String, args:[CVarArgType]) -> String {
return NSString(format:format, arguments:getVaList(args))
}
"Hello %@, This is pi : %.2f" % ["World", M_PI]
"Hello %@, This is pi : %.2f" % ["World", M_PI]
berfungsi, tapi anehnya "%@ %@" % ["Hello", "World"]
menaikkan can'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
let string = String(format: "%.2f", locale: Locale.current, arguments: 15.123)
Anda masih dapat menggunakan NSLog di Swift seperti pada Objective-C hanya tanpa tanda @.
NSLog("%.02f %.02f %.02f", r, g, b)
Sunting: Setelah bekerja dengan Swift sejak beberapa saat saya ingin menambahkan variasi ini juga
var r=1.2
var g=1.3
var b=1.4
NSLog("\(r) \(g) \(b)")
Keluaran:
2014-12-07 21:00:42.128 MyApp[1626:60b] 1.2 1.3 1.4
(5.2).rounded()
// 5.0
(5.5).rounded()
// 6.0
(-5.2).rounded()
// -5.0
(-5.5).rounded()
// -6.0
func rounded (_ rule: FloatingPointRoundingRule) -> Dobel
let x = 6.5
// Equivalent to the C 'round' function:
print(x.rounded(.toNearestOrAwayFromZero))
// Prints "7.0"
// Equivalent to the C 'trunc' function:
print(x.rounded(.towardZero))
// Prints "6.0"
// Equivalent to the C 'ceil' function:
print(x.rounded(.up))
// Prints "7.0"
// Equivalent to the C 'floor' function:
print(x.rounded(.down))
// Prints "6.0"
var x = 5.2
x.round()
// x == 5.0
var y = 5.5
y.round()
// y == 6.0
var z = -5.5
z.round()
// z == -6.0
mutating func round (_ rule: FloatingPointRoundingRule)
// Equivalent to the C 'round' function:
var w = 6.5
w.round(.toNearestOrAwayFromZero)
// w == 7.0
// Equivalent to the C 'trunc' function:
var x = 6.5
x.round(.towardZero)
// x == 6.0
// Equivalent to the C 'ceil' function:
var y = 6.5
y.round(.up)
// y == 7.0
// Equivalent to the C 'floor' function:
var z = 6.5
z.round(.down)
// z == 6.0
extension Numeric {
private func _precision(number: NSNumber, formatter: NumberFormatter) -> Self? {
if let formatedNumString = formatter.string(from: number),
let formatedNum = formatter.number(from: formatedNumString) {
return formatedNum as? Self
}
return nil
}
private func toNSNumber() -> NSNumber? {
if let num = self as? NSNumber { return num }
guard let string = self as? String, let double = Double(string) else { return nil }
return NSNumber(value: double)
}
func precision(_ minimumFractionDigits: Int,
roundingMode: NumberFormatter.RoundingMode = NumberFormatter.RoundingMode.halfUp) -> Self? {
guard let number = toNSNumber() else { return nil }
let formatter = NumberFormatter()
formatter.minimumFractionDigits = minimumFractionDigits
formatter.roundingMode = roundingMode
return _precision(number: number, formatter: formatter)
}
func precision(with numberFormatter: NumberFormatter) -> String? {
guard let number = toNSNumber() else { return nil }
return numberFormatter.string(from: number)
}
}
_ = 123.44.precision(2)
_ = 123.44.precision(3, roundingMode: .up)
let numberFormatter = NumberFormatter()
numberFormatter.minimumFractionDigits = 1
numberFormatter.groupingSeparator = " "
let num = 222.3333
_ = num.precision(2)
func option1<T: Numeric>(value: T, numerFormatter: NumberFormatter? = nil) {
print("Type: \(type(of: value))")
print("Original Value: \(value)")
let value1 = value.precision(2)
print("value1 = \(value1 != nil ? "\(value1!)" : "nil")")
let value2 = value.precision(5)
print("value2 = \(value2 != nil ? "\(value2!)" : "nil")")
if let value1 = value1, let value2 = value2 {
print("value1 + value2 = \(value1 + value2)")
}
print("")
}
func option2<T: Numeric>(value: T, numberFormatter: NumberFormatter) {
print("Type: \(type(of: value))")
print("Original Value: \(value)")
let value1 = value.precision(with: numberFormatter)
print("formated value = \(value1 != nil ? "\(value1!)" : "nil")\n")
}
func test(with double: Double) {
print("===========================\nTest with: \(double)\n")
let float = Float(double)
let float32 = Float32(double)
let float64 = Float64(double)
let float80 = Float80(double)
let cgfloat = CGFloat(double)
// Exapmle 1
print("-- Option1\n")
option1(value: double)
option1(value: float)
option1(value: float32)
option1(value: float64)
option1(value: float80)
option1(value: cgfloat)
// Exapmle 2
let numberFormatter = NumberFormatter()
numberFormatter.formatterBehavior = .behavior10_4
numberFormatter.minimumIntegerDigits = 1
numberFormatter.minimumFractionDigits = 4
numberFormatter.maximumFractionDigits = 9
numberFormatter.usesGroupingSeparator = true
numberFormatter.groupingSeparator = " "
numberFormatter.groupingSize = 3
print("-- Option 2\n")
option2(value: double, numberFormatter: numberFormatter)
option2(value: float, numberFormatter: numberFormatter)
option2(value: float32, numberFormatter: numberFormatter)
option2(value: float64, numberFormatter: numberFormatter)
option2(value: float80, numberFormatter: numberFormatter)
option2(value: cgfloat, numberFormatter: numberFormatter)
}
test(with: 123.22)
test(with: 1234567890987654321.0987654321)
===========================
Test with: 123.22
-- Option1
Type: Double
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44
Type: Float
Original Value: 123.22
value1 = nil
value2 = nil
Type: Float
Original Value: 123.22
value1 = nil
value2 = nil
Type: Double
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44
Type: Float80
Original Value: 123.21999999999999886
value1 = nil
value2 = nil
Type: CGFloat
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44
-- Option 2
Type: Double
Original Value: 123.22
formatted value = 123.2200
Type: Float
Original Value: 123.22
formatted value = 123.220001221
Type: Float
Original Value: 123.22
formatted value = 123.220001221
Type: Double
Original Value: 123.22
formatted value = 123.2200
Type: Float80
Original Value: 123.21999999999999886
formatted value = nil
Type: CGFloat
Original Value: 123.22
formatted value = 123.2200
===========================
Test with: 1.2345678909876544e+18
-- Option1
Type: Double
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18
Type: Float
Original Value: 1.234568e+18
value1 = nil
value2 = nil
Type: Float
Original Value: 1.234568e+18
value1 = nil
value2 = nil
Type: Double
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18
Type: Float80
Original Value: 1234567890987654400.0
value1 = nil
value2 = nil
Type: CGFloat
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18
-- Option 2
Type: Double
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000
Type: Float
Original Value: 1.234568e+18
formatted value = 1 234 567 939 550 610 000.0000
Type: Float
Original Value: 1.234568e+18
formatted value = 1 234 567 939 550 610 000.0000
Type: Double
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000
Type: Float80
Original Value: 1234567890987654400.0
formatted value = nil
Type: CGFloat
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000
extension Double {
func formatWithDecimalPlaces(decimalPlaces: Int) -> Double {
let formattedString = NSString(format: "%.\(decimalPlaces)f", self) as String
return Double(formattedString)!
}
}
1.3333.formatWithDecimalPlaces(2)
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
//It will more help, by specify how much decimal Point you want.
let decimalPoint = 2
let floatAmount = 1.10001
let amountValue = String(format: "%0.*f", decimalPoint, floatAmount)
di sini solusi cepat "murni"
var d = 1.234567
operator infix ~> {}
@infix func ~> (left: Double, right: Int) -> String {
if right == 0 {
return "\(Int(left))"
}
var k = 1.0
for i in 1..right+1 {
k = 10.0 * k
}
let n = Double(Int(left*k)) / Double(k)
return "\(n)"
}
println("\(d~>2)")
println("\(d~>1)")
println("\(d~>0)")
Kekuatan ekstensi
extension Double {
var asNumber:String {
if self >= 0 {
var formatter = NSNumberFormatter()
formatter.numberStyle = .NoStyle
formatter.percentSymbol = ""
formatter.maximumFractionDigits = 1
return "\(formatter.stringFromNumber(self)!)"
}
return ""
}
}
let velocity:Float = 12.32982342034
println("The velocity is \(velocity.toNumber)")
Output: Kecepatannya 12,3
Juga dengan pembulatan:
extension Float
{
func format(f: String) -> String
{
return NSString(format: "%\(f)f", self)
}
mutating func roundTo(f: String)
{
self = NSString(format: "%\(f)f", self).floatValue
}
}
extension Double
{
func format(f: String) -> String
{
return NSString(format: "%\(f)f", self)
}
mutating func roundTo(f: String)
{
self = NSString(format: "%\(f)f", self).doubleValue
}
}
x = 0.90695652173913
x.roundTo(".2")
println(x) //0.91
gunakan metode di bawah ini
let output = String.localizedStringWithFormat(" %.02f %.02f %.02f", r, g, b)
println(output)
Banyak jawaban bagus di atas, tetapi kadang-kadang sebuah pola lebih sesuai daripada jenis gobbledygook "% .3f". Inilah pendapat saya menggunakan NumberFormatter di Swift 3.
extension Double {
func format(_ pattern: String) -> String {
let formatter = NumberFormatter()
formatter.format = pattern
return formatter.string(from: NSNumber(value: self))!
}
}
let n1 = 0.350, n2 = 0.355
print(n1.format("0.00#")) // 0.35
print(n2.format("0.00#")) // 0.355
Di sini saya ingin 2 desimal selalu ditampilkan, tetapi yang ketiga hanya jika bukan nol.
Pembaruan Swift 4 Xcode 10
extension Double {
var asNumber:String {
if self >= 0 {
let formatter = NumberFormatter()
formatter.numberStyle = .none
formatter.percentSymbol = ""
formatter.maximumFractionDigits = 2
return "\(formatter.string(from: NSNumber(value: self)) ?? "")"
}
return ""
}
}
Bagaimana dengan ekstensi pada tipe Double dan CGFloat:
extension Double {
func formatted(_ decimalPlaces: Int?) -> String {
let theDecimalPlaces : Int
if decimalPlaces != nil {
theDecimalPlaces = decimalPlaces!
}
else {
theDecimalPlaces = 2
}
let theNumberFormatter = NumberFormatter()
theNumberFormatter.formatterBehavior = .behavior10_4
theNumberFormatter.minimumIntegerDigits = 1
theNumberFormatter.minimumFractionDigits = 1
theNumberFormatter.maximumFractionDigits = theDecimalPlaces
theNumberFormatter.usesGroupingSeparator = true
theNumberFormatter.groupingSeparator = " "
theNumberFormatter.groupingSize = 3
if let theResult = theNumberFormatter.string(from: NSNumber(value:self)) {
return theResult
}
else {
return "\(self)"
}
}
}
Pemakaian:
let aNumber: Double = 112465848348508.458758344
Swift.print("The number: \(aNumber.formatted(2))")
cetakan: 112 465 848 348 508,46
@infix func ^(left:Double, right: Int) -> NSNumber {
let nf = NSNumberFormatter()
nf.maximumSignificantDigits = Int(right)
return nf.numberFromString(nf.stringFromNumber(left))
}
let r = 0.52264
let g = 0.22643
let b = 0.94837
println("this is a color: \(r^3) \(g^3) \(b^3)")
// this is a color: 0.523 0.226 0.948
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)
func logRect(r: CGRect, _ title: String = "") {
println(String(format: "[ (%.0f, %.0f), (%.0f, %.0f) ] %@",
Double(r.origin.x), Double(r.origin.y), Double(r.size.width), Double(r.size.height), title))
}
Contoh Swift2: Lebar layar perangkat iOS yang memformat Float menghapus desimal
print(NSString(format: "Screen width = %.0f pixels", CGRectGetWidth(self.view.frame)))
@Christian Dietrich:
dari pada:
var k = 1.0
for i in 1...right+1 {
k = 10.0 * k
}
let n = Double(Int(left*k)) / Double(k)
return "\(n)"
bisa juga:
let k = pow(10.0, Double(right))
let n = Double(Int(left*k)) / k
return "\(n)"
[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:
infix operator ~> {}
func ~> (left: Double, right: Int) -> Double {
if right <= 0 {
return round(left)
}
let k = pow(10.0, Double(right))
return round(left*k) / k
}
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:
println("Pi is roughly \(3.1415926 ~> 3)")
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:
d = Double(slider.value) ~> 2
atau apapun yang kamu butuhkan ...