Подтвердить что ты не робот

Как преобразовать double в int в swift

Итак, я пытаюсь выяснить, как я могу заставить свою программу потерять .0 после целого числа, когда мне не нужны никакие десятичные разряды.

@IBOutlet weak var numberOfPeopleTextField: UITextField!
@IBOutlet weak var amountOfTurkeyLabel: UILabel!
@IBOutlet weak var cookTimeLabel: UILabel!
@IBOutlet weak var thawTimeLabel: UILabel!


var turkeyPerPerson = 1.5
var hours: Int = 0
var minutes = 0.0

func multiply (#a: Double, b: Double) -> Double {
    return a * b
}

func divide (a: Double , b: Double) -> Double {
    return a / b
}

@IBAction func calculateButton(sender: AnyObject) {
    var numberOfPeople = numberOfPeopleTextField.text.toInt()
    var amountOfTurkey = multiply(a: 1.5, b: Double(numberOfPeople!))
    var x: Double = amountOfTurkey
    var b: String = String(format:"%.1f", x)
    amountOfTurkeyLabel.text = "Amount of Turkey: " + b + "lbs"

    var time = multiply(a: 15, b:  amountOfTurkey)
    var x2: Double = time
    var b2: String = String(format:"%.1f", x2)
    if (time >= 60) {
        time = time - 60
        hours = hours + 1
        minutes = time
        var hours2: String = String(hours)
        var minutes2: String = String(format: "%.1f", minutes)

        cookTimeLabel.text = "Cook Time: " + hours2 + " hours and " + minutes2 + " minutes"
    }else {
        cookTimeLabel.text = "Cook Time: " + b2 + "minutes"
    }

}

}

Нужно ли мне заставить оператор if каким-то образом превратить Double в Int, чтобы это работало?

4b9b3361

Ответ 1

Вы можете использовать:

Int(yourDoubleValue)

это преобразует double в int.

или когда вы используете формат String, используйте 0 вместо 1:

String(format: "%.0f", yourDoubleValue)

это просто отобразит ваше двойное значение без десятичных знаков без преобразования его в int.

Ответ 2

Лучше проверить размер значения Double прежде чем конвертировать его, иначе он может потерпеть крах.

extension Double {
    func toInt() -> Int? {
        if self >= Double(Int.min) && self < Double(Int.max) {
            return Int(self)
        } else {
            return nil
        }
    }
}

Int(Double.greatestFiniteMagnitude) легко продемонстрировать, просто используйте Int(Double.greatestFiniteMagnitude).

Ответ 3

Более общим способом подавления (только) десятичного NSNumberFormatter.0 в строковом представлении значения Double является использование NSNumberFormatter. Он также учитывает числовой формат текущей локали.

let x : Double = 2.0
let doubleAsString = NumberFormatter.localizedString(from: (NSNumber(value: x), numberStyle: .decimal) 
// --> "2"

Ответ 4

Эти ответы действительно не принимают во внимание ограничения выражения Int.max и Int.min, которые есть у Doubles. Интты 64-битные, но в мантиссе двойные имеют только 52-битную точность.

Лучший ответ:

extension Double {
    func toInt() -> Int? {
        guard (self <= Double(Int.max).nextDown) && (self >= Double(Int.min).nextUp) else {
            return nil
        }

        return Int(self)
    }
}

Ответ 5

Swift 4 - Xcode 9

let value = doubleToInteger(data:"ENTER DOUBLE VALUE")

func doubleToInteger(data:Double)-> Int {
            let doubleToString = "\(data)"
            let stringToInteger = (doubleToString as NSString).integerValue

            return stringToInteger
        }

Ответ 6

Swift 4 - Xcode 10

Используйте этот код, чтобы избежать сбоя, если значение double превышает границы int (и поэтому не может быть представлено):

Добавьте это личное расширение в свой класс:

private extension Int {

    init?(doubleVal: Double) {
        guard (doubleVal <= Double(Int.max).nextDown) && (doubleVal >= Double(Int.min).nextUp) else {
        return nil
    }

    self.init(doubleVal)
}

Используйте расширение в своем классе следующим образом:

func test() {

    let d = Double(123.564)
    guard let intVal = Int(doubleVal: d) else {
        print("cannot be converted")
    }

    print("converted: \(intVal)")
}

Ответ 7

Swift 5 Xcode10.3

потерять .0 или сохранить, когда что-то после десятичного числа, как .07

func doubleToIntWhenDecimalZero(number: Double) -> Any {
    if number.truncatingRemainder(dividingBy: 1.0) == 0.0 {
        return Int(number)
    } else {
        return number
    }
}