将一个双点拆分为两个数字
Split a double by dot to two numbers
所以我想在 swift 中拆分一个数字,我尝试在互联网上搜索这个但没有成功。所以首先我将从一个数字开始:
var number = 34.55
从这个数字,我想通过从点拆分来创建两个单独的数字。所以输出应该是这样的:
var firstHalf = 34
var secondHalf = 55
或者输出也可以在一个更简单的数组中。我怎样才能做到这一点?
好吧,你那里有一个浮点数,而不是一个字符串。你不能真的 "split" 它,记住浮点数并不严格限制在分隔符后的 2 位数字。
一个解决方案是:
var firstHalf = Int(number)
var secondHalf = Int((number - firstHalf) * 100)
这很讨厌,但它会为您的示例做正确的事情(但是,在处理精度超过两位小数的数字时会失败)
或者,您可以将其转换为字符串,然后拆分它。
var stringified = NSString(format: "%.2f", number)
var parts = stringifed.componentsSeparatedByString(".")
请注意,我在这里明确调用格式化程序,以避免标准浮点数到字符串转换的不良行为。
最简单的方法是先将双精度数转换为字符串:
var d = 34.55
var b = "\(d)" // or String(d)
然后使用全局 split
函数拆分字符串:
var c = split(b) { [=11=] == "." } // [34, 55]
您还可以将此功能烘焙成双重功能:
extension Double {
func splitAtDecimal() -> [Int] {
return (split("\(self)") { [=12=] == "." }).map({
return String([=12=]).toInt()!
})
}
}
这将允许您执行以下操作:
var number = 34.55
print(number.splitAtDecimal()) // [34, 55]
添加以下扩展名:
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)
输出:
LeftPart: 95 RightPart: 2
实际上,不可能将一个双精度数按点拆分为两个整数。所有早期提供的解决方案在将近 10% 的情况下都会产生错误。
原因如下:
不区分大小写的是带小数部分的数字以一个或多个零开头,例如:1.05
、11.00698
等
任何以一个或多个零开头的小数部分将在转换为整数时丢弃这些 零 。这些转换的结果:
1.05
将变为 (1
, 5
)
11.00698
将变为 (11
, 698
)
肯定会出现难看且难以发现的错误...
有意义地拆分十进制数的唯一方法是将其转换为 (Int, Double)
。下面是 Double
的一个简单扩展:
extension Double {
func splitAtDecimal() -> (Int, Double) {
let whole = Int(self)
let decimal = self - Darwin.floor(self)
return (whole, decimal)
}
}
所以我想在 swift 中拆分一个数字,我尝试在互联网上搜索这个但没有成功。所以首先我将从一个数字开始:
var number = 34.55
从这个数字,我想通过从点拆分来创建两个单独的数字。所以输出应该是这样的:
var firstHalf = 34
var secondHalf = 55
或者输出也可以在一个更简单的数组中。我怎样才能做到这一点?
好吧,你那里有一个浮点数,而不是一个字符串。你不能真的 "split" 它,记住浮点数并不严格限制在分隔符后的 2 位数字。
一个解决方案是:
var firstHalf = Int(number)
var secondHalf = Int((number - firstHalf) * 100)
这很讨厌,但它会为您的示例做正确的事情(但是,在处理精度超过两位小数的数字时会失败)
或者,您可以将其转换为字符串,然后拆分它。
var stringified = NSString(format: "%.2f", number)
var parts = stringifed.componentsSeparatedByString(".")
请注意,我在这里明确调用格式化程序,以避免标准浮点数到字符串转换的不良行为。
最简单的方法是先将双精度数转换为字符串:
var d = 34.55
var b = "\(d)" // or String(d)
然后使用全局 split
函数拆分字符串:
var c = split(b) { [=11=] == "." } // [34, 55]
您还可以将此功能烘焙成双重功能:
extension Double {
func splitAtDecimal() -> [Int] {
return (split("\(self)") { [=12=] == "." }).map({
return String([=12=]).toInt()!
})
}
}
这将允许您执行以下操作:
var number = 34.55
print(number.splitAtDecimal()) // [34, 55]
添加以下扩展名:
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)
输出:
LeftPart: 95 RightPart: 2
实际上,不可能将一个双精度数按点拆分为两个整数。所有早期提供的解决方案在将近 10% 的情况下都会产生错误。
原因如下:
不区分大小写的是带小数部分的数字以一个或多个零开头,例如:1.05
、11.00698
等
任何以一个或多个零开头的小数部分将在转换为整数时丢弃这些 零 。这些转换的结果:
1.05
将变为 (1
, 5
)
11.00698
将变为 (11
, 698
)
肯定会出现难看且难以发现的错误...
有意义地拆分十进制数的唯一方法是将其转换为 (Int, Double)
。下面是 Double
的一个简单扩展:
extension Double {
func splitAtDecimal() -> (Int, Double) {
let whole = Int(self)
let decimal = self - Darwin.floor(self)
return (whole, decimal)
}
}