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
format
Biç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 LosslessStringConvertible
ve 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 FloatingPoint
protokolü 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.50
ABD'de ancak 10.000,50
Almanya'da ortaya çıkmasıdır . Farklı yerel ayarların sayılar için farklı tercih edilen biçimleri NumberFormatter
vardı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
}
}
LossLessStringConvertible
Doubleextension 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)"