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!
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!
(5.2).rounded()
// 5.0
(5.5).rounded()
// 6.0
(-5.2).rounded()
// -5.0
(-5.5).rounded()
// -6.0
func rounded(_ rule: FloatingPointRoundingRule) -> Double
let x = 6.5
// Äquivalent zur C 'round' Funktion:
print(x.rounded(.toNearestOrAwayFromZero))
// Gibt "7.0" aus
// Äquivalent zur C 'trunc' Funktion:
print(x.rounded(.towardZero))
// Gibt "6.0" aus
// Äquivalent zur C 'ceil' Funktion:
print(x.rounded(.up))
// Gibt "7.0" aus
// Äquivalent zur C 'floor' Funktion:
print(x.rounded(.down))
// Gibt "6.0" aus
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)
// Äquivalent zur C 'round' Funktion:
var w = 6.5
w.round(.toNearestOrAwayFromZero)
// w == 7.0
// Äquivalent zur C 'trunc' Funktion:
var x = 6.5
x.round(.towardZero)
// x == 6.0
// Äquivalent zur C 'ceil' Funktion:
var y = 6.5
y.round(.up)
// y == 7.0
// Äquivalent zur C 'floor' Funktion:
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(value: T, numerFormatter: NumberFormatter? = nil) {
print("Typ: \(type(of: value))")
print("Ursprünglicher Wert: \(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(value: T, numberFormatter: NumberFormatter) {
print("Typ: \(type(of: value))")
print("Ursprünglicher Wert: \(value)")
let value1 = value.precision(with: numberFormatter)
print("formatierter Wert = \(value1 != nil ? "\(value1!)" : "nil")\n")
}
func test(with double: Double) {
print("===========================\nTest mit: \(double)\n")
let float = Float(double)
let float32 = Float32(double)
let float64 = Float64(double)
let float80 = Float80(double)
let cgfloat = CGFloat(double)
// Beispiel 1
print("-- Option1\n")
option1(value: double)
option1(value: float)
option1(value: float32)
option1(value: float64)
option1(value: float80)
option1(value: cgfloat)
// Beispiel 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 mit: 123.22
-- Option1
Typ: Double
Ursprünglicher Wert: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44
Typ: Float
Ursprünglicher Wert: 123.22
value1 = nil
value2 = nil
Typ: Float
Ursprünglicher Wert: 123.22
value1 = nil
value2 = nil
Typ: Double
Ursprünglicher Wert: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44
Typ: Float80
Ursprünglicher Wert: 123.21999999999999886
value1 = nil
value2 = nil
Typ: CGFloat
Ursprünglicher Wert: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44
-- Option 2
Typ: Double
Ursprünglicher Wert: 123.22
formatierter Wert = 123.2200
Typ: Float
Ursprünglicher Wert: 123.22
formatierter Wert = 123.220001221
Typ: Float
Ursprünglicher Wert: 123.22
formatierter Wert = 123.220001221
Typ: Double
Ursprünglicher Wert: 123.22
formatierter Wert = 123.2200
Typ: Float80
Ursprünglicher Wert: 123.21999999999999886
formatierter Wert = nil
Typ: CGFloat
Ursprünglicher Wert: 123.22
formatierter Wert = 123.2200
===========================
Test mit: 1.2345678909876544e+18
-- Option1
Typ: Double
Ursprünglicher Wert: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18
Typ: Float
Ursprünglicher Wert: 1.234568e+18
value1 = nil
value2 = nil
Typ: Float
Ursprünglicher Wert: 1.234568e+18
value1 = nil
value2 = nil
Typ: Double
Ursprünglicher Wert: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18
Typ: Float80
Ursprünglicher Wert: 1234567890987654400.0
value1 = nil
value2 = nil
Typ: CGFloat
Ursprünglicher Wert: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18
-- Option 2
Typ: Double
Ursprünglicher Wert: 1.2345678909876544e+18
formatierter Wert = 1 234 567 890 987 650 000.0000
Typ: Float
Ursprünglicher Wert: 1.234568e+18
formatierter Wert = 1 234 567 939 550 610 000.0000
Typ: Float
Ursprünglicher Wert: 1.234568e+18
formatierter Wert = 1 234 567 939 550 610 000.0000
Typ: Double
Ursprünglicher Wert: 1.2345678909876544e+18
formatierter Wert = 1 234 567 890 987 650 000.0000
Typ: Float80
Ursprünglicher Wert: 1234567890987654400.0
formatierter Wert = nil
Typ: CGFloat
Ursprünglicher Wert: 1.2345678909876544e+18
formatierter Wert = 1 234 567 890 987 650 000.0000
Sie können NSLog in Swift genauso wie in Objective-C verwenden, nur ohne das @-Zeichen.
NSLog("%.02f %.02f %.02f", r, g, b)
Bearbeiten: Nachdem ich eine Weile mit Swift gearbeitet habe, möchte ich auch diese Variation hinzufügen
var r=1.2
var g=1.3
var b=1.4
NSLog("\(r) \(g) \(b)")
Ausgabe:
2014-12-07 21:00:42.128 MyApp[1626:60b] 1.2 1.3 1.4
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.