Yanıtlar:
Çevrim değil, formatlı bir değerden bir string yaratıyor.
let a: Double = 1.5
let b: String = String(format: "%f", a)
print("b: \(b)") // b: 1.500000
Farklı bir formatla:
let c: String = String(format: "%.1f", a)
print("c: \(c)") // c: 1.5
formatBiçimlendirme gerekmiyorsa özelliği atlayabilirsiniz .
format:"%.1f" = 1 digit // 1.5:; format:"%.5f" = 5 digits // 1.50000
String(yourDouble).
let double = 1.5
let string = double.description
Xcode 7.1'i güncelleyin • Swift 2.1:
Artık Double, String'e dönüştürülebilir, böylece istediğiniz gibi kullanabilirsiniz:
let double = 1.5
let doubleString = String(double) // "1.5"
Swift 3 veya daha sonra genişletebilir LosslessStringConvertibleve genel hale getirebiliriz
Xcode 11.3 • Swift 5.1 veya üzeri
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let double = 1.5
let string = double.string // "1.5"
Sabit sayıda kesir basamağı için FloatingPointprotokolü genişletebiliriz :
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.*f", digits, self as! CVarArg)
}
}
Sayı biçiminiz üzerinde daha fazla kontrole ihtiyacınız varsa (minimum ve maksimum kesir basamakları ve yuvarlama modu) NumberFormatter'ı kullanabilirsiniz:
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)ileString(format: "%.*f", digits, self as! CVarArg)
@Zaph cevabına ek olarak, extension:
extension Double {
func toString() -> String {
return String(format: "%.1f",self)
}
}
Kullanımı:
var a:Double = 1.5
println("output: \(a.toString())") // output: 1.5
a.toString()başka bir geliştirici tarafından görüldüğünde kesinlikle bir WTF anı olacaktır.
myToString()ve özel tanımından emin olmak için değiştirebilirsiniz . Ancak diğer dillerde olduğu gibi prototipleme, kod kopyalarının ve iyi bakımın önlenmesine yol açar.
println("output: \(a.toString())")ve arasındaki fark nedir println("output: \(a)")? İkinci seçenek derleme hatalarına neden olmaz. Bu seçenek kötü bir uygulama mı?
yourDouble?.toString() ?? ""
Swift 3+: Bu kod satırını deneyin
let num: Double = 1.5
let str = String(format: "%.2f", num)
Swift 4 : Aşağıdaki kodu kullanın
let number = 2.4
let string = String(format: "%.2f", number)
Bu işlev, gösterilecek ondalık basamak sayısını belirlemenize izin verir:
func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}
Kullanımı:
let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)
String(format:"%."+numberOfDecimalPlaces.description+"f", number)ileString(format:"%.*f", numberOfDecimalPlaces, number)
Burada çeşitli teknikler öneren birçok cevap var. Ancak, kullanıcı arayüzünde sayıları sunarken NumberFormatter, sonuçların düzgün şekilde biçimlendirilmesi, yuvarlanması ve yerelleştirilmesi için her zaman bir a kullanmak istersiniz :
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.5
Sabit sayıda ondalık basamak istiyorsanız, örneğin para birimi değerleri için
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
Ancak bu yaklaşımın güzelliği, doğru bir şekilde yerelleştirilmesi ve sonuç olarak 10,000.50ABD'de ancak 10.000,50Almanya'da ortaya çıkmasıdır . Farklı yerel ayarların sayılar için farklı tercih edilen biçimleri NumberFormattervardır ve kullanıcı arayüzünde sayısal değerleri sunarken son kullanıcı tarafından tercih edilen biçimi kullanmamıza izin vermeliyiz .
Söylemeye gerek yok NumberFormatter, kullanıcı arayüzü içinde dize gösterimleri hazırlarken çok önemliyken, kalıcı depolama için dizeler olarak sayısal değerler yazarken, web servisleriyle arayüz vb. Yazılıyorsa kullanılmamalıdır.
Swift 3'te aşağıda verildiği gibi basittir
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"benim için döndürür .
var b = String(stringInterpolationSegment: a)
Bu benim için çalışıyor. Bir deneyebilirsin
Swift 4'te, kullanıcı arayüzünde bir İkili değiştirmek ve kullanmak isterseniz, bunu bir textLabel "String" olarak dosyanızın sonuna ekleyebilirsiniz:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
Ve bir metin etiketinde olmasını istiyorsanız, bunu şu şekilde kullanın:
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
Veya Int olarak yazdırın:
print(weatherData.tempCelsius.roundToInt())
NSNumber ve NumberFormatter yaklaşımını tercih ederim (ihtiyaç duyulduğunda), ayrıca şişkinlik kodunu önlemek için uzantı da kullanabilirsiniz.
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
U ayrıca ters yaklaşıma da ihtiyaç duyabilir
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
LossLessStringConvertibleDoubleextension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : Aşağıdaki kodu kullanın
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)ileString(format: "%.*f", points, self)
var b = "\(a)"