До того, как я обновил xCode 6, у меня не было проблем с литьем двойного строкового буфера, теперь он дает мне ошибку
var a: Double = 1.5
var b: String = String(a)
Это дает мне сообщение об ошибке "double не конвертируется в строку". Есть ли другой способ сделать это?
Ответ 1
Это не приведение, это создание строки из значения в формате.
let a:Double = 1.5
let b:String = String(format:"%f", a)
print("b: \(b)") // b: 1.500000
С другим форматом:
let c:String = String(format:"%.1f", a)
print("c: \(c)") // c: 1.5
Ответ 2
let myDouble = 1.5
let myString = myDouble.description
обновить Xcode 7.1 • Swift 2.1:
Теперь Double также можно преобразовать в String, поэтому вы можете просто использовать его по своему усмотрению:
let myDouble = 1.5
let myDoubleString = String(myDouble) // "1.5"
Xcode 8.3.2 • Swift 3.1:
В Swift 3 или более поздней LosslessStringConvertible
мы можем расширить LosslessStringConvertible
и сделать его универсальным
extension LosslessStringConvertible {
var string: String { return .init(self) }
}
1.0.string // "1.0"
Для фиксированного числа цифр дроби вы также можете расширить Double:
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.\(digits)f", self as! CVarArg)
}
}
Если вам нужен больший контроль над форматом чисел (минимальные и максимальные дробные цифры и режим округления), вы можете использовать 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"
Ответ 3
В дополнение к @Zaph answer, вы можете создать extension:
extension Double {
func toString() -> String {
return String(format: "%.1f",self)
}
}
Использование:
var a:Double = 1.5
println("output: \(a.toString())") // output: 1.5
Ответ 4
Свифт 3+: попробуйте эти строки кода
let num: Double = 1.5
let str = String(format: "%.2f", num)
Ответ 5
чтобы сделать что-нибудь строковое в swift, за исключением, может быть, значений перечисления просто делать то, что вы делаете в методе println()
например:
var stringOfDBL = "\(myDouble)"
Ответ 6
Эта функция позволит вам указать количество отображаемых десятичных знаков:
func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}
Использование:
let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)
Ответ 7
Swift 4:
Используйте следующий код
let number = 2.4
let string = String(format: "%.2f", number)
Ответ 8
В быстром 3:
var a: Double = 1.5
var b: String = String(a)
Ответ 9
В быстром 3 это просто, как указано ниже
let stringDouble = String(describing: double)
Ответ 10
Я бы предпочел подход NSNumber и NumberFormatter (где это необходимо), также вы можете использовать расширение, чтобы избежать вздутия кода
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
U также может понадобиться обратный подход
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
Ответ 11
var b = String(stringInterpolationSegment: a)
Это работает для меня. У вас может быть попытка
Ответ 12
В Swift 4, если вы хотите изменить и использовать Double в пользовательском интерфейсе как textLabel "String", вы можете добавить это в конец вашего файла:
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
И используйте это так, если вы хотите, чтобы это было в текстовой метке:
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
Или распечатайте его как Int:
print(weatherData.tempCelsius.roundToInt())
Ответ 13
Swift 5:
Используйте следующий код
extension Double {
func getStringValue(withFloatingPoints points: Int = 0) -> String {
let valDouble = modf(self)
let fractionalVal = (valDouble.1)
if fractionalVal > 0 {
return String(format: "%.\(points)f", self)
}
return String(format: "%.0f", self)
}
}