Specifier Format String Presisi Dalam Swift

395

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!

pengguna3524868
sumber

Jawaban:

277

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.

Anton Tcholakov
sumber
76
Ini tidak perlu rumit. Jawaban realityone bekerja dan jauh lebih ringkas.
Steven Marlowe
9
Tentu jika Anda hanya menggunakannya sekali. Tetapi jika Anda ingin memiliki lebih banyak opsi format menggunakan interpolasi string (yang jauh lebih mudah dibaca) maka Anda bisa meletakkan semua ekstensi format dalam file di tempat lain dan referensi di seluruh proyek Anda. Tentu saja, idealnya Apple harus menyediakan pustaka pemformatan.
Anton Tcholakov
2
Solusi ini tidak akan berfungsi di Swift 1.2 tanpa melemparkan hasilnya ke String.
ibesora
Bagus, tapi bukan Swift 2 Friend.
LastMove
798

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))
realityone
sumber
9
println(String(format: "a float number: %.5f", 1.0321))
zaph
78
Saya percaya ini adalah jawaban yang lebih baik daripada jawaban yang diterima. Ini jauh lebih dekat dengan c-style standar printftanpa harus menulis ekstensi terpisah.
Keith Morris
9
Jangan lupa "import Foundation" di bagian atas file.
Chris Gregg
3
Ini lebih baik daripada jawaban yang diterima tetapi masih menggunakan metode Foundation (dijembatani ke Swift).
1
Pastikan untukimport Foundation
NaN
125

Saya menemukan String.localizedStringWithFormatbekerja dengan baik:

Contoh:

let value: Float = 0.33333
let unit: String = "mph"

yourUILabel.text = String.localizedStringWithFormat("%.2f %@", value, unit)
Valentin
sumber
Pertanyaannya tidak ada hubungannya dengan unit penanganan. localizedStringWithFormat bagus, tetapi tidak terkait.
AmitP
Saya setuju AmitP, ditanya sebelum String (format: ..., argumen: ...) tersedia
Valentin
84

Ini adalah cara yang sangat cepat dan sederhana yang tidak membutuhkan solusi yang rumit.

let duration = String(format: "%.01f", 3.32323242)
// result = 3.3
fatihyildizhan
sumber
Ini tidak dapat dikompilasi (menggunakan 3.0.2 di kotak pasir Swift IBM):Col 16: 'init' has been renamed to 'init(describing:)'
Peter Dillinger
@PeterDillinger Anda memberikan nilai opsional bukan nilai yang terbuka.
Michael
63

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

Pembaruan SWIFT 3.1

extension Float {
    func string(fractionDigits:Int) -> String {
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = fractionDigits
        formatter.maximumFractionDigits = fractionDigits
        return formatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}
Donn
sumber
12
Saya berharap lebih banyak orang akan menggunakan 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).
Rob
3
Satu-satunya perbaikan yang ingin saya lihat, adalah menyimpan formatter untuk nomor berapa pun - NSNumberFormatters mahal untuk dibangun.
Kendall Helmstetter Gelner
1
tepatnya, apa yang saya cari! Terima kasih
gunjot singh
Saya tahu ini adalah pertanyaan yang agak lama, tetapi NSNumberFormattercukup 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.
promacuser
44

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, Stringsecara langsung mendukung format:penginisialisasi, sehingga tidak perlu menggunakan NSStringdan @infixatribut 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"
David Berry
sumber
di mana Anda menemukan sintaks `NSString (format:" formatString ", val) '. Saya tidak melihatnya di dokumen iBooks dari Apple.
Duncan C
1
Itu sama dengan membangun objek objektif-c dari swift. Ini versi cepat[NSString stringWithFormat...
David Berry
Kena kau. Saya belum sampai sejauh itu di Swift iBook.
Duncan C
IIRC yang tidak ada di Swift iBook. Itu di salah satu sesi WWDC. Interoperabilitas Swift Dalam Kedalaman
ahruss
2
Jika Anda menerapkan% seperti pada Python seharusnya sebaliknya. "% 5.3f"% M_PI
Andy Dent
16

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/

Steyn Viljoen
sumber
Sejauh ini ini adalah solusi terbaik, saya tidak mengerti bagaimana ini tidak ada di puncak.
pjtnt11
7
hal nitpicky .. 1.500000000 hanya akan menjadi "1,5" dan bukan "1,50"
styler1972
13
import Foundation

extension CGFloat {
    var string1: String {
        return String(format: "%.1f", self)
    }
    var string2: String {
        return String(format: "%.2f", self)
    }
}

Pemakaian

let offset = CGPoint(1.23, 4.56)
print("offset: \(offset.x.string1) x \(offset.y.string1)")
// offset: 1.2 x 4.6
neoneye
sumber
10

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]
Vincent Guerci
sumber
Sayangnya ini mati dalam beta 6: kesalahan fatal: tidak bisa tidak amanBitCast antara jenis ukuran yang berbeda.
binarymochi
@ binarymochi Dengan Beta 6: "Hello %@, This is pi : %.2f" % ["World", M_PI]berfungsi, tapi anehnya "%@ %@" % ["Hello", "World"]menaikkan can't unsafeBitCast... Tebak itu akan diperbaiki di versi berikutnya.
Vincent Guerci
Bisakah Anda menjadikan ',' menjadi operator yang digunakan? '@infix func, (...', lalu tulis string Anda seperti "Halo% @, ini pi:% .2f", ["you", M_PI])?
Rick
@Rick no you can not, ,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/…
Vincent Guerci
8

Cepat 4

let string = String(format: "%.2f", locale: Locale.current, arguments: 15.123)
onmyway133
sumber
let temp: Float = div * 100 let string = String (format: "% .2f", locale: Locale.current, argumen: temp) itu memberi saya kesalahan. Tidak dapat mengonversi nilai tipe 'Float' ke tipe argumen yang diharapkan '[CVarArg]
Chandni
Anda harus memasukkan 15.123 ke dalam array untuk membuatnya berfungsi
Dorian Roy
3
bagi saya berfungsi: biarkan string = String (format: "% .2f", myString)
Grzegorz R. Kulesza
6

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
hol
sumber
6

Detail

  • Xcode 9.3, Swift 4.1
  • Xcode 10.2.1 (10E1001), Swift 5

Solusi 1

func rounded () -> Double

(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"

mutating func round ()

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

Solusi 2

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)
    }
}

Pemakaian

_ = 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)

Sampel lengkap

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)

Keluaran

===========================
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
Bodnarchuk dengan mudah
sumber
4
extension Double {
  func formatWithDecimalPlaces(decimalPlaces: Int) -> Double {
     let formattedString = NSString(format: "%.\(decimalPlaces)f", self) as String
     return Double(formattedString)!
     }
 }

 1.3333.formatWithDecimalPlaces(2)
Lucas Farah
sumber
3

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

fqdn
sumber
3
//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)
Ravi Kumar
sumber
2

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)")
Christian Dietrich
sumber
2

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

Muhammad Aamir Ali
sumber
2

cara mengetik kurang:

func fprint(format: String, _ args: CVarArgType...) {
    print(NSString(format: format, arguments: getVaList(args)))
}
puncak
sumber
1

Anda juga dapat membuat operator dengan cara ini

operator infix <- {}

func <- (format: String, args:[CVarArg]) -> String {
    return String(format: format, arguments: args)
}

let str = "%d %.1f" <- [1453, 1.123]
otello
sumber
1

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
ChikabuZ
sumber
1

gunakan metode di bawah ini

let output = String.localizedStringWithFormat(" %.02f %.02f %.02f", r, g, b)

println(output)
Ramkumar chintala
sumber
1

Versi operator ruby ​​/ python% Vincent Guerci, diperbarui untuk Swift 2.1:

func %(format:String, args:[CVarArgType]) -> String {
  return String(format:format, arguments:args)
}

"Hello %@, This is pi : %.2f" % ["World", M_PI]
Paul King
sumber
1

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.

AlexT
sumber
1

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 ""
    }
}
Jason
sumber
1

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

M Wilm
sumber
0
@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
pengguna3778351
sumber
0

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))
}
cahaya terang
sumber
0

Contoh Swift2: Lebar layar perangkat iOS yang memformat Float menghapus desimal

print(NSString(format: "Screen width = %.0f pixels", CGRectGetWidth(self.view.frame)))
Gunnar Forsgren - Mobimation
sumber
-1

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

Stuepfnick
sumber
Ini jelas dimaksudkan sebagai komentar, saya mengerti bahwa Anda memerlukan lebih banyak ruang untuk menyampaikan poin, dan ini berharga, tetapi jika Anda akan menuliskannya sebagai jawaban lengkap, manfaatkan dengan sendirinya, secara mandiri; Anda dapat menambahkan kode lengkap, misalnya, dan kemudian komentar dan pengakuan kepada Christian.
Jaime Gómez
@Jaime Gómez: Saya tidak diizinkan untuk mengomentari jawaban di atas. Tapi bagaimanapun, saya memiliki beberapa interpretasi yang salah di dalamnya. Tidak tahu, apakah layak disimpan atau harus dihapus. Tentu saja ini dapat digunakan dengan cara yang sama hanya untuk pembulatan (tanpa konversi String) dan dapat dengan mudah diterjemahkan ke bahasa pemrograman lain. * Saya berasumsi bahwa dengan Double, dibulatkan menjadi sekitar 8 digit, yang tentu saja merupakan kesalahan, karena saya melakukannya dengan Float dan mengubahnya menjadi Double secara tidak sengaja.
Stuepfnick
PS: Saya lebih suka menggunakan metode serupa lebih banyak untuk pembulatan secara umum, bukan keluaran String, jadi kembalilah ketik Double (& metode biasa?) Sidenote : Jika Anda membulatkan Float seperti itu (yaitu dari Slider) dan hasilnya ke String itu akan baik-baik saja, seperti "0,1", tetapi jika Anda mengonversi Float itu menjadi Double dan kemudian ke String * itu akan menjadi: "0,100000001490116", karena Float tidak mampu menyimpan 0,1 dengan tepat, hanya sangat dekat. Saya kira itu sama dengan Double, hanya dengan presisi ganda ;) Jadi selalu konversi ke Double sebelum pembulatan, jadi itu akan setepat mungkin dan dikonversi ke String juga.
Stuepfnick
PPS: Tentu saja, dengan Return Type Double, kadang-kadang sedikit berbeda, yaitu jika Anda perlu mengatur teks label, Anda perlu menulis: myLabel.text = "\ (d ~> 2)" bukan hanya: myLabel. text = d ~> 2 , tapi saya masih berpikir, fungsinya lebih praktis seperti itu. (tentu saja semua orang dapat melakukan, apa yang mereka inginkan, hanya pikiran saya ...)
Stuepfnick
-2

menggunakan

CGFloat 

atau

Float.roundTo(places:2)
Nicson
sumber
1
CGFloat tidak memiliki putaran anggota ke
Chandni