将两个点分成两个数字

时间:2015-02-14 03:36:35

标签: swift swift-playground

所以我试图快速分割一个数字,我试图在互联网上搜索这个但是没有成功。首先,我将从一个数字开始:

var number = 34.55

从这个数字开始,我想通过从点分割来创建两个单独的数字。所以输出应该是这样的:

var firstHalf = 34
var secondHalf = 55

或者输出也可以更容易。我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:5)

最简单的方法是首先将double转换为字符串:

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

然后用全局split函数分割字符串:

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

您还可以将此功能烘焙为双倍:

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

这将允许您执行以下操作:

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

答案 1 :(得分:2)

嗯,你在那里有一个浮子,而不是一个字符串。你不能真正“分裂”它,并记住浮点数并不严格限制在分隔符后的2位数。

一个解决方案是:

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

这很讨厌,但它会为你的例子做正确的事情(但是,当处理精度超过两位小数的数字时,它会失败)

或者,您可以将其转换为字符串,然后将其拆分。

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

请注意,我在这里显式调用了formatter,以避免标准float到string转换的不必要行为。

答案 2 :(得分:1)

添加以下扩展程序:

var max = 5;

var p = Promise.reject();
for(var i=0; i<max; i++) {
    p = p.catch(attempt).then(test);
}
p = p.then(processResult).catch(errorHandler);

function attempt() {
    var rand = Math.random();
    if(rand < 0.8) {
        throw rand;
    } else {
        return rand;
    }
}
function test(val) {
    if(val < 0.9) {
        throw val;
    } else {
        return val;
    }
}
function processResult(res) {
    console.log(res);
}
function errorHandler(err) {
    console.error(err);
}

用法 - 无根据:

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)

}

输出:

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)

答案 3 :(得分:0)

实际上,不可能将双精度点分隔成两个INTEGER数字。较早提供的所有解决方案都将在近10%的情况下产生错误。

这是为什么:

破损的情况将是带有小数部分的数字以一个或多个零开头的,例如:1.0511.00698

任何以一个或多个零开头的小数部分将在转换为整数时丢弃那些。这些转换的结果:

1.05将成为(15

11.00698将成为(11698

保证可以发现丑陋且难以发现的错误...

有意义地拆分十进制数字的唯一方法是将其转换为(Int, Double)。以下是对Double的简单扩展:

extension Double {

    func splitAtDecimal() -> (Int, Double) {

        let whole = Int(self)
        let decimal = self - Darwin.floor(self)

        return (whole, decimal)
    }
}