Как преобразовать 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, чтобы это работало?
Ответы
Ответ 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
}
}