从双打中删除尾随零的函数是什么?
var double = 3.0
var double2 = 3.10
println(func(double)) // 3
println(func(double2)) // 3.1
你可以这样做但它会返回一个字符串:
var double = 3.0
var double2 = 3.10
func forTrailingZero(temp: Double) -> String {
var tempVar = String(format: "%g", temp)
return tempVar
}
forTrailingZero(double) //3
forTrailingZero(double2) //3.1
在Swift 4中你可以这样做:
extension Double {
func removeZerosFromEnd() -> String {
let formatter = NumberFormatter()
let number = NSNumber(value: self)
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 16 //maximum digits in Double after dot (maximum precision)
return String(formatter.string(from: number) ?? "")
}
}
使用示例:print (Double("128834.567891000").removeZerosFromEnd())
结果:128834.567891
您还可以计算字符串的小数位数:
import Foundation
extension Double {
func removeZerosFromEnd() -> String {
let formatter = NumberFormatter()
let number = NSNumber(value: self)
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = (self.components(separatedBy: ".").last)!.count
return String(formatter.string(from: number) ?? "")
}
}
当需要默认输出精度时,此方案很好。我们测试潜在尾随零的值,并根据它使用不同的输出格式。
extension Double {
var stringWithoutZeroFraction: String {
return truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
}
}
(也适用于extension Float
,但不适用于Float80
)
输出:
1.0 → "1" 0.1 → "0.1" 0.01 → "0.01" 0.001 → "0.001" 0.0001 → "0.0001"
当需要自定义输出精度时,此方案很好。这个解决方案看起来和NumberFormatter + NSNumber solution from MirekE一样快,但有一个好处就是我们在这里避免使用NSObject。
extension Double {
func string(maximumFractionDigits: Int = 2) -> String {
let s = String(format: "%.\(maximumFractionDigits)f", self)
for i in stride(from: 0, to: -maximumFractionDigits, by: -1) {
if s[s.index(s.endIndex, offsetBy: i - 1)] != "0" {
return String(s[..<s.index(s.endIndex, offsetBy: i)])
}
}
return String(s[..<s.index(s.endIndex, offsetBy: -maximumFractionDigits - 1)])
}
}
(也适用于extension Float
,但不适用于Float80
)
maximumFractionDigits: 2
的输出:
1.0 → "1" 0.12 → "0.12" 0.012 → "0.01" 0.0012 → "0" 0.00012 → "0"