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!

53voto

David Berry Punkte 40327

Sie können es (noch) nicht mit der Zeichenketteninterpolation machen. Ihre beste Option ist immer noch die Verwendung der NSString-Formatierung:

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

Ausgehend von Python scheint eine vernünftige Syntax wie folgt zu sein:

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

Dann können Sie sie verwenden als:

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

Sie können ähnliche Operatoren für alle numerischen Typen definieren, leider habe ich noch keine Möglichkeit gefunden, dies mit Generics zu tun.

Update Swift 5

Ab mindestens Swift 5 unterstützt String direkt den format:-Initializer, daher ist es nicht mehr notwendig, NSString zu verwenden und das @infix-Attribut ist nicht mehr erforderlich. Das bedeutet, dass die obigen Beispiele wie folgt geschrieben werden sollten:

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

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

Double.pi % "%5.3f"         // "3.142"

17voto

Steyn Viljoen Punkte 327

Warum machst du es so kompliziert? Du kannst stattdessen dies verwenden:

import UIKit

let PI = 3.14159265359

round( PI ) // 3.0 auf die nächste Dezimalstelle gerundet
round( PI * 100 ) / 100 //3.14 auf die nächste Hunderstel gerundet
round( PI * 1000 ) / 1000 // 3.142 auf die nächste Tausendstel gerundet

Sieh es im Playground funktionieren.

PS: Lösung von: http://rrike.sh/xcode/rounding-various-decimal-places-swift/

17voto

Tiago Almeida Punkte 13695

Nach iOS 15+ wird diese Lösung empfohlen:

2.31234.formatted(.number.precision(.fractionLength(1)))

15voto

neoneye Punkte 47046
import Foundation

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

Verwendung

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

11voto

Vincent Guerci Punkte 14209

Eine elegantere und generischere Lösung besteht darin, den Ruby / Python % Operator neu zu schreiben:

// Aktualisiert für Beta 5
func %(format:String, args:[CVarArgType]) -> String {
    return NSString(format:format, arguments:getVaList(args))
}

"Hallo %@, Dies ist Pi: %.2f" % ["Welt", M_PI]

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