2015-02-14 5 views
2

Так что я пытаюсь разбить число в swift, я попытался найти это в Интернете, но не имел успеха. Поэтому первым Начну с номером, как:Разделить двойное на точку на два числа

var number = 34.55 

И из этого числа, я хочу, чтобы создать два отдельных номера расщеплением от точки. Таким образом, выход должен быть примерно таким:

var firstHalf = 34 
var secondHalf = 55 

Или выход также может быть в массиве этого проще. Как я могу это достичь?

ответ

4

Самый простой способ будет первый отливать двойной в строку:

var d = 34.55 
var b = "\(d)" // or String(d) 

затем разбить строку с глобальной split функции:

var c = split(b) { $0 == "." } // [34, 55] 

Вы также можете испечь эту функцию в double:

extension Double { 
    func splitAtDecimal() -> [Int] { 
     return (split("\(self)") { $0 == "." }).map({ 
      return String($0).toInt()! 
     }) 
    } 
} 

Это позволит вам сделать следующее:

var number = 34.55 
print(number.splitAtDecimal()) // [34, 55] 
+0

Будет ли c быть массивом? – Sachin

+0

Спасибо! Это было самое простое решение :) – Sachin

+0

@Sachin Мой первый метод фактически возвращает массив строк: '[" 34 "," 55 "]'. Я обновил свой ответ методом возврата массива int. – royhowie

2

Ну, у вас есть поплавок, а не строка. Вы не можете «разбить» его и помнить, что поплавок строго не ограничивается двумя цифрами после разделителя.

Одно из решений:

var firstHalf = Int(number) 
var secondHalf = Int((number - firstHalf) * 100) 

Это противно, но это будет делать правильные вещи для вашего примера (это, однако, не имея дело с числами, которые имеют более двух десятичных знаков точности)

Альтернативно, вы можете преобразовать его в строку, а затем разделить.

var stringified = NSString(format: "%.2f", number) 
var parts = stringifed.componentsSeparatedByString(".") 

Обратите внимание, что я явно вызывая форматировщик здесь, чтобы избежать нежелательного поведения стандартного поплавка строковых преобразований.

+0

Где она будет хранить два новых номера? – Sachin

0

Добавьте следующее расширение:

extension Double { 

func splitIntoParts(decimalPlaces: Int, round: Bool) -> (leftPart: Int, rightPart: Int) { 

    var number = self 
    if round { 
     //round to specified number of decimal places: 
     let divisor = pow(10.0, Double(decimalPlaces)) 
     number = Darwin.round(self * divisor)/divisor 
    } 

    //convert to string and split on decimal point: 
    let parts = String(number).components(separatedBy: ".") 

    //extract left and right parts: 
    let leftPart = Int(parts[0]) ?? 0 
    let rightPart = Int(parts[1]) ?? 0 

    return(leftPart, rightPart) 

} 

Usage - неокругленные:

let number:Double = 95.99999999 
let parts = number.splitIntoParts(decimalPlaces: 3, round: false) 

print("LeftPart: \(parts.leftPart) RightPart: \(parts.rightPart)") 

Выходы:

LeftPart: 95 RightPart: 999 

Использование Округлые:

let number:Double = 95.199999999 
let parts = number.splitIntoParts(decimalPlaces: 1, round: true) 

Выходы:

LeftPart: 95 RightPart: 2 
Смежные вопросы