Swift'te Hassas Dize Biçimi Tanımlayıcısı


395

Aşağıda daha önce iki ondalık basamağa kadar bir şamandırayı nasıl keserdim

NSLog(@" %.02f %.02f %.02f", r, g, b);

Dokümanları ve e-Kitabı kontrol ettim ancak anlayamadım. Teşekkürler!

Yanıtlar:


277

David'in yanıtından sonra şimdiye kadarki en iyi çözümüm :

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

Biçimlendirme işlemlerini doğrudan veri türüne bağlayan en Swift benzeri çözüm olduğunu düşünüyorum. Bir yerde biçimlendirme işlemleri için yerleşik bir kütüphane olması iyi olabilir, ya da yakında yayınlanacak. Dilin hala beta aşamasında olduğunu unutmayın.


76
Bu gereksiz bir şekilde karmaşık. realityone'un cevabı işe yarıyor ve çok daha özlü.
Steven Marlowe

9
Tabii sadece bir kez kullanıyorsanız. Ancak, dize enterpolasyonu (daha okunabilir) kullanarak daha fazla biçimlendirme seçeneğine sahip olmak istiyorsanız, tüm biçimlendirme uzantılarını başka bir yere bir dosyaya yerleştirebilir ve projeniz boyunca referans gösterebilirsiniz. Tabii ki, ideal olarak Apple biçimlendirme kütüphanesini sağlamalıdır.
Anton Tcholakov

2
Bu çözüm, sonucu String'e dönüştürmeden Swift 1.2'de çalışmaz.
ibesora

Güzel, ama Swift 2 Arkadaş değil.
LastMove

798

basit bir yol:

import Foundation // required for String(format: _, _)

print(String(format: "hex string: %X", 123456))
print(String(format: "a float number: %.5f", 1.0321))

9
println(String(format: "a float number: %.5f", 1.0321))
zaph

78
Bunun kabul edilen cevaptan daha iyi bir cevap olduğuna inanıyorum. printfAyrı uzantılar yazmak zorunda kalmadan standart c-stiline çok daha yakındır .
Keith Morris

9
Dosyanın üstündeki "içe aktarma temeli" ni unutmayın.
Chris Gregg

3
Bu, kabul edilen cevaptan daha iyidir, ancak yine de Foundation yöntemlerini (Swift ile köprülenmiştir) kullanmaktadır.

1
Emin olunimport Foundation
NaN

125

String.localizedStringWithFormatOldukça iyi çalıştım :

Misal:

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

yourUILabel.text = String.localizedStringWithFormat("%.2f %@", value, unit)

Sorunun birimlerin ele alınması ile ilgisi yoktur. localizedStringWithFormat güzel, ancak ilgili değil.
AmitP

AmitP'ye katılıyorum, Dize (format: ..., argümanlar: ...) mevcut olmadan önce soruldu
Valentin

84

Bu, karmaşık bir çözüme ihtiyaç duymayan çok hızlı ve basit bir yoldur.

let duration = String(format: "%.01f", 3.32323242)
// result = 3.3

Bu derlenmez (IBM'in Swift sanal alanında 3.0.2 kullanarak):Col 16: 'init' has been renamed to 'init(describing:)'
Peter Dillinger

@PeterDillinger, kaydırılmamış değer yerine isteğe bağlı olarak geçiyor.
Michael

63

Buradaki cevapların çoğu geçerlidir. Ancak, sayıyı sık sık biçimlendirmeniz durumunda, biçimlendirilmiş bir dize döndüren bir yöntem eklemek için Float sınıfını genişletmeyi düşünün. Aşağıdaki örnek kodlara bakın. Bu, bir sayı biçimlendirici ve uzantı kullanarak aynı hedefe ulaşır.

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 şunları gösterir:

The velocity is 12.33
The velocity is 12.3

SWIFT 3.1 güncellemesi

extension Float {
    func string(fractionDigits:Int) -> String {
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = fractionDigits
        formatter.maximumFractionDigits = fractionDigits
        return formatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}

12
Keşke NSNumberFormatterbu cevap gibi daha fazla insan kullansın. Diğer yüksek oy alan cevaplar, cihazın yerel ayarlarını yansıtmakta başarısız olur (örneğin, bazı yerel ayarlarda, ondalık basamak için virgül kullanırlar;
Rob

3
Görmek istediğim tek gelişme, herhangi bir sayı için biçimlendiriciyi saklamaktır - NSNumberFormatters'ın yapımı pahalıdır.
Kendall Helmstetter Gelner

1
tam olarak, ben ne aradığını! Teşekkürler
gunjot singh

Bunun biraz eski bir soru olduğunu biliyorum, ancak NSNumberFormatterbaşlatılması oldukça yavaş. Mümkünse, bir tanesinin tanımlanmasına ve yeniden kullanılmasına yardımcı olur. Bununla birlikte, bu soruyu burada okuyorum, çünkü benim durumumda bu mümkün değil.
promacuser

44

Dize enterpolasyonu ile (henüz) yapamazsınız. En iyi bahsiniz hala NSString biçimlendirmesi olacak:

println(NSString(format:"%.2f", sqrt(2.0)))

Python'dan tahmin etmek, makul bir sözdizimi gibi görünebilir:

@infix func % (value:Double, format:String) -> String {
    return NSString(format:format, value)
}

Bu da onları şu şekilde kullanmanıza izin verir:

M_PI % "%5.3f"                // "3.142"

Tüm sayısal tipler için benzer operatörler tanımlayabilirsiniz, maalesef jeneriklerle yapmanın bir yolunu bulamadım.

Swift 5 Güncellemesi

En azından Swift 5'ten itibaren, Stringdoğrudan format:başlatıcıyı destekler , bu yüzden kullanmaya gerek yoktur NSStringve @infixniteliğe artık gerek yoktur, bu da yukarıdaki örneklerin şu şekilde yazılması gerektiği anlamına gelir:

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 (format: "formatString", val) '' sözdizimini nerede buldunuz. Apple'ın iBooks belgesinde görmüyorum.
Duncan C

1
Herhangi bir objektif-c nesnesini hızlı bir şekilde inşa etmekle aynıdır. Bu hızlı versiyonu[NSString stringWithFormat...
David Berry

Anladım. Swift iBook'da henüz bu kadar ilerlemedim.
Duncan C

Swift iBook'da olmayan IIRC. WWDC oturumlarından birindeydi. Derinlikle Hızlı Birlikte Çalışabilirlik
ahruss

2
Eğer Python'da olduğu gibi% uyguluyorsanız, bunun tam tersi olmalıdır. "% 5,3f"% M_PI
Andy Dent

16

Neden bu kadar karmaşık? Bunun yerine şunları kullanabilirsiniz:

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

Oyun alanında çalıştığını görün.

Not: Çözüm: http://rrike.sh/xcode/rounding-various-decimal-places-swift/


Bu en iyi çözüm, bunun en üstte nasıl olmadığını anlamıyorum.
pjtnt11

7
nitpicky şey .. 1.500000000 "1.50" değil, sadece "1.5" olacaktır
styler1972

13
import Foundation

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

kullanım

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

10

Daha zarif ve genel bir çözüm, yakut / python %operatörünü yeniden yazmaktır :

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

Ne yazık ki bu beta 6'da ölüyor: ölümcül hata: farklı boyut türleri arasında güvensiz olamazBitCast.
binarymochi

@binarymochi ile Beta 6: "Hello %@, This is pi : %.2f" % ["World", M_PI]çalışır, ancak garip "%@ %@" % ["Hello", "World"]zam can't unsafeBitCast... sonraki sürümde giderilecektir sanırım.
Vincent Guerci

Kullanılan operatöre ',' yapabilir misiniz? '@infix func, (…') ve ardından dizelerinizi "Merhaba% @, bu pi:% .2f", ["siz", M_PI])?
Rick

@ Yapamam ,, Swift ve çoğu dilde geçerli bir karakter operatörü değil. Ve imo, %diğer dillerde zaten mevcut olan operatörü kullanmak daha iyidir . Bkz. Developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Vincent Guerci

8

Hızlı 4

let string = String(format: "%.2f", locale: Locale.current, arguments: 15.123)

let temp: Float = div * 100 let string = String (format: "% .2f", yerel ayar: Locale.current, arguments: temp) bana hata veriyor. 'Float' türünün değeri '[CVarArg]
Chandni

çalışmasını sağlamak için 15.123'ü bir diziye koymanız gerekir
Dorian Roy

3
benim için çalışıyor: let string = String (format: "% .2f", myString)
Grzegorz R. Kulesza

6

Swift'te NSLog'u @ işareti olmadan Objective-C'deki gibi kullanabilirsiniz.

NSLog("%.02f %.02f %.02f", r, g, b)

Edit: Bir süre Swift ile çalıştıktan sonra ben de bu varyasyon eklemek istiyorum

    var r=1.2
    var g=1.3
    var b=1.4
    NSLog("\(r) \(g) \(b)")

Çıktı:

2014-12-07 21:00:42.128 MyApp[1626:60b] 1.2 1.3 1.4

6

ayrıntılar

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

Çözüm 1

yuvarlak func () -> Çift

(5.2).rounded()
// 5.0
(5.5).rounded()
// 6.0
(-5.2).rounded()
// -5.0
(-5.5).rounded()
// -6.0

yuvarlak yuvarlatılmış (_ kuralı: FloatingPointRoundingRule) -> Çift

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"

dönüşümü yuvarlak ()

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

functing func round (_ kuralı: 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

Çözüm 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)
    }
}

kullanım

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

Tam örnek

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)

Çıktı

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

4
extension Double {
  func formatWithDecimalPlaces(decimalPlaces: Int) -> Double {
     let formattedString = NSString(format: "%.\(decimalPlaces)f", self) as String
     return Double(formattedString)!
     }
 }

 1.3333.formatWithDecimalPlaces(2)

3

Şimdiye kadar en çok oyu alan cevaplar NSString yöntemlerine dayanıyor ve Vakfı ithal etmenizi gerektiriyor.

Ancak bunu yaptıktan sonra hala NSLog'a erişebilirsiniz.

Bu yüzden sorunun cevabını düşünüyorum, Swift'te NSLog'u nasıl kullanmaya devam edeceğinizi soruyorsanız, basitçe:

import Foundation


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)

2

burada "saf" hızlı bir çözüm

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

2

Uzatma gücü

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

Çıktı: Hız 12.3


2

daha az yazım yolu:

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

1

Bu şekilde bir operatör de oluşturabilirsiniz

operator infix <- {}

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

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

1

Ayrıca yuvarlama ile:

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

1

aşağıdaki yöntemi kullan

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

println(output)

1

Vincent Guerci'nin yakut / python% operatörünün Swift 2.1 için güncellenmiş bir versiyonu:

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

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

1

Yukarıda iyi cevaplar bol, ama bazen bir desen "% .3f" tür gobbledygook daha uygundur. İşte Swift 3'te bir NumberFormatter kullanıyorum.

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

Burada 2 ondalık sayıların her zaman gösterilmesini istedim, ancak üçüncüsü sadece sıfır olmasaydı.


1

Swift 4 Xcode 10 Güncellemesi

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

1

Double ve CGFloat türlerindeki uzantılar hakkında:

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

Kullanımı:

let aNumber: Double = 112465848348508.458758344
Swift.print("The number: \(aNumber.formatted(2))")

baskılar: 112468548348 508,46


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

0

Ben bilmem iki ondalık basamağa, ama burada o 2 yer, 3, yerler ... olabilir hayal ediyorum böylece, sıfır ondalık basamağa sahip yüzen yazdırmak için aşağıdaki adımları (Not: gerekir Double CGFloat dönüştürmek geçmek to String (format :) veya sıfır değeri görür)

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

0

Swift2 örneği: Ondalık kaldırarak Float'ı biçimlendiren iOS cihazının ekran genişliği

print(NSString(format: "Screen width = %.0f pixels", CGRectGetWidth(self.view.frame)))

-1

@Christian Dietrich:

onun yerine:

var k = 1.0
    for i in 1...right+1 {
        k = 10.0 * k
    }
let n = Double(Int(left*k)) / Double(k)
return "\(n)"

ayrıca:

let k = pow(10.0, Double(right))
let n = Double(Int(left*k)) / k
return "\(n)"

[düzeltme:] Maalesef * karışıklık için - Çiftler ile Tabii bu eserlerin Of. Bence, en pratik (rakamların yuvarlatılmasını, kesilmemesini istiyorsanız) şöyle bir şey olurdu:

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
}

Sadece Float için, Double'u Float, pow ile powf ve roundf ile round.
Güncelleme: String yerine Double türünü kullanmanın en pratik olduğunu buldum. String çıktısı için aynı şekilde çalışır, yani:

println("Pi is roughly \(3.1415926 ~> 3)")

baskılar: Pi kabaca 3.142
Böylece, Dizeler için de aynı şekilde kullanabilirsiniz (yine de şunu yazabilirsiniz: println (d ~> 2)), ancak ek olarak değerleri doğrudan yuvarlamak için de kullanabilirsiniz, yani:

d = Double(slider.value) ~> 2

ya da neye ihtiyacınız varsa…


Bu açıkça bir yorum olması amaçlanmıştır, bir noktaya değinmek için daha fazla alana ihtiyacınız olduğunu anlıyorum ve değerlidir, ancak tam teşekküllü bir cevap olarak yazacaksanız, bağımsız olarak yararlı olmasını sağlayın; örneğin, tam kodu ekleyebilir ve ardından Hıristiyan'a bir açıklama ve onaylama ekleyebilirsiniz.
Jaime Gómez

@Jaime Gómez: Yukarıdaki cevaba yorum yapmama izin verilmiyor. Ama her neyse, içinde yanlış bir yorum * vardı. Saklanmaya değer mi yoksa silinmesi mi gerektiğini bilmiyorum. Tabii ki bu sadece yuvarlama için benzer bir şekilde kullanılabilir (String dönüştürme olmadan) ve diğer programlama dillerine kolayca çevrilebilir. * Double ile yaklaşık 8 basamağa yuvarlandığını varsaydım, ki bu elbette bir hataydı, çünkü Float ile yuvarladım ve bunu yanlışlıkla Double'e dönüştürdüm.
Stuepfnick

Not: Benzer yöntemleri daha genel olarak yuvarlama için kullanmayı tercih ederim, String çıktısı için değil, bu yüzden dönüş türü Double (& normal yöntem?) Sidenote : Bir Float'ı bu şekilde (yani bir Slider'dan) ve Dize sonucunu döndürürseniz "0.1" gibi iyi olacak, ancak Float'ı Double'e ve sonra String * 'e dönüştürürseniz: "0.100000001490116" olacaktır, çünkü Float 0.1'i tam olarak depolayamaz, sadece çok yakındır. Sanırım çift ile aynı, sadece çift ​​hassasiyetle ;) Bu yüzden her zaman yuvarlamadan önce Double'e dönüştürün , bu yüzden mümkün olduğunca kesin olacak ve String fine'e de dönüşecektir.
Stuepfnick

PPS: Tabii ki, Dönüş Tipi Double ile bazen biraz farklıdır, yani bir etiket metni ayarlamanız gerekiyorsa, sadece şunu yazmanız gerekir: myLabel.text = "\ (d ~> 2)" : myLabel. text = d ~> 2 , ama yine de, fonksiyonun bu şekilde daha pratik olduğunu düşünüyorum. (tabii ki herkes yapabilir, istediklerini, sadece düşüncelerimi…)
Stuepfnick

-2

kullanım

CGFloat 

veya

Float.roundTo(places:2)

1
CGFloat için hiçbir üye turu yok
Chandni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.