Odpowiedzi:
Nie jest rzutowaniem, ale tworzeniem łańcucha z wartości o określonym formacie.
let a: Double = 1.5
let b: String = String(format: "%f", a)
print("b: \(b)") // b: 1.500000
W innym formacie:
let c: String = String(format: "%.1f", a)
print("c: \(c)") // c: 1.5
Możesz również pominąć tę format
właściwość, jeśli formatowanie nie jest potrzebne.
format:"%.1f" = 1 digit // 1.5
; format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
.
let double = 1.5
let string = double.description
zaktualizuj Xcode 7.1 • Swift 2.1:
Teraz Double można również zamienić na String, więc możesz go po prostu używać, jak chcesz:
let double = 1.5
let doubleString = String(double) // "1.5"
Swift 3 lub nowszy możemy rozszerzyć LosslessStringConvertible
i uczynić go ogólnym
Xcode 11.3 • Swift 5.1 lub nowszy
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let double = 1.5
let string = double.string // "1.5"
Dla ustalonej liczby cyfr ułamkowych możemy rozszerzyć FloatingPoint
protokół:
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.*f", digits, self as! CVarArg)
}
}
Jeśli potrzebujesz większej kontroli nad formatem liczb (minimalne i maksymalne cyfry ułamkowe oraz tryb zaokrąglania), możesz użyć NumberFormatter:
extension Formatter {
static let number = NumberFormatter()
}
extension FloatingPoint {
func fractionDigits(min: Int = 2, max: Int = 2, roundingMode: NumberFormatter.RoundingMode = .halfEven) -> String {
Formatter.number.minimumFractionDigits = min
Formatter.number.maximumFractionDigits = max
Formatter.number.roundingMode = roundingMode
Formatter.number.numberStyle = .decimal
return Formatter.number.string(for: self) ?? ""
}
}
2.12345.fractionDigits() // "2.12"
2.12345.fractionDigits(min: 3, max: 3, roundingMode: .up) // "2.124"
String(format: "%.\(digits)f", self as! CVarArg)
zString(format: "%.*f", digits, self as! CVarArg)
Oprócz odpowiedzi @Zaph możesz tworzyć extension:
extension Double {
func toString() -> String {
return String(format: "%.1f",self)
}
}
Stosowanie:
var a:Double = 1.5
println("output: \(a.toString())") // output: 1.5
a.toString()
zobaczy inny programista, na pewno będzie moment WTF.
myToString()
aby mieć pewność, że jest to niestandardowa definicja. Ale podobnie jak w innych językach, prototypowanie prowadzi do uniknięcia powielania kodu i dobrej konserwacji.
println("output: \(a.toString())")
i println("output: \(a)")
. Druga opcja nie powoduje błędów kompilacji. Czy ta opcja jest złą praktyką?
yourDouble?.toString() ?? ""
Swift 3+: wypróbuj ten wiersz kodu
let num: Double = 1.5
let str = String(format: "%.2f", num)
Swift 4 : Użyj następującego kodu
let number = 2.4
let string = String(format: "%.2f", number)
Ta funkcja umożliwia określenie liczby miejsc dziesiętnych do wyświetlenia:
func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}
Stosowanie:
let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)
String(format:"%."+numberOfDecimalPlaces.description+"f", number)
zString(format:"%.*f", numberOfDecimalPlaces, number)
Istnieje wiele odpowiedzi, które sugerują różne techniki. Ale podczas prezentowania liczb w interfejsie użytkownika zawsze chcesz użyć znaku a, NumberFormatter
aby wyniki były odpowiednio sformatowane, zaokrąglone i zlokalizowane:
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.5
Jeśli chcesz mieć stałą liczbę miejsc dziesiętnych, np. Dla wartości walut
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.50
Ale piękno tego podejścia polega na tym, że będzie ono odpowiednio zlokalizowane, co spowoduje, że w 10,000.50
USA, ale 10.000,50
w Niemczech. Różne lokalizacje mają różne preferowane formaty liczb i powinniśmy pozwolić na NumberFormatter
użycie formatu preferowanego przez użytkownika końcowego podczas prezentowania wartości liczbowych w interfejsie użytkownika.
Nie trzeba dodawać, że chociaż NumberFormatter
jest niezbędny podczas przygotowywania reprezentacji ciągów w interfejsie użytkownika, nie powinien być używany w przypadku zapisywania wartości liczbowych jako ciągów do trwałego przechowywania, interfejsu z usługami sieciowymi itp.
W Swift 3 jest to proste, jak podano poniżej
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
Dla mnie.
var b = String(stringInterpolationSegment: a)
To działa dla mnie. Możesz spróbować
W Swift 4, jeśli chcesz modyfikować i używać Double w interfejsie użytkownika jako textLabel „String”, możesz dodać to na końcu swojego pliku:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
I użyj tego w ten sposób, jeśli chcesz mieć to na etykiecie tekstowej:
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
Lub wydrukuj jako Int:
print(weatherData.tempCelsius.roundToInt())
Wolałbym podejście NSNumber i NumberFormatter (w razie potrzeby), a także możesz użyć rozszerzenia, aby uniknąć wzdęcia kodu
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
Możesz również potrzebować odwrotnego podejścia
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
LossLessStringConvertible
protokołem zamiast rozszerzania Double extension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : Użyj następującego kodu
extension Double {
func getStringValue(withFloatingPoints points: Int = 0) -> String {
let valDouble = modf(self)
let fractionalVal = (valDouble.1)
if fractionalVal > 0 {
return String(format: "%.*f", points, self)
}
return String(format: "%.0f", self)
}
}
String(format: "%.\(points)f", self)
zString(format: "%.*f", points, self)
var b = "\(a)"