Быстрая двойная строка

До того, как я обновил 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)
    }
}