457 Stimmen

Präzisionszeichenfolge-Formatierungszeichen in Swift

Im Folgenden wird gezeigt, wie ich zuvor einen Float auf zwei Dezimalstellen gekürzt hätte

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

Ich habe die Dokumentation und das eBook überprüft, aber bisher nicht herausfinden können. Vielen Dank!

3voto

fqdn Punkte 2833

Die bisher am meisten abgestimmten Antworten verlassen sich auf NSString-Methoden und erfordern, dass Sie Foundation importiert haben.

Wenn Sie das getan haben, haben Sie jedoch immer noch Zugriff auf NSLog.

Ich denke also, die Antwort auf die Frage, wie man in Swift weiterhin NSLog verwenden kann, lautet einfach:

import Foundation

2voto

Christian Dietrich Punkte 11451

Hier eine "reine" Swift-Lösung

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

2voto

M Wilm Punkte 164

Was ist mit Erweiterungen für Double- und CGFloat-Typen:

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

Verwendung:

let aNumber: Double = 112465848348508.458758344
Swift.print("Die Nummer: \(aNumber.formatted(2))")

gibt aus: 112 465 848 348 508.46

2voto

AlexT Punkte 546

Es gibt viele gute Antworten oben, aber manchmal ist ein Muster als das "%.3f" Art von Kauderwelsch angemessener. Hier ist meine Umsetzung mit einem NumberFormatter in 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

Hier wollte ich immer 2 Nachkommastellen anzeigen, aber die dritte nur, wenn sie nicht null war.

2voto

Muhammad Aamir Ali Punkte 19629

Leistung der Erweiterung

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("Die Geschwindigkeit beträgt \(velocity.toNumber)")

Ausgabe: Die Geschwindigkeit beträgt 12.3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X