Swift – 从Double中删除尾随零
从双打中删除尾随零的function是什么?
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())
result: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”
使用最大小数位格式化,不带尾随零
当需要自定义输出精度时,此方案很好。 这个解决方案看起来和MirekE的 NumberFormatter + NSNumber 解决方案一样快,但有一个好处就是我们在这里避免使用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[..
(也适用于extension Float
,但不适Float80
)
maximumFractionDigits: 2
输出maximumFractionDigits: 2
:
1.0→“1”
0.12→“0.12”
0.012→“0.01”
0.0012→“0”
0.00012→“0”
如果你想保持Double
in数字格式,那么你应该使用rounded
函数。
请参阅Apple Docs
let myDouble = 12.6767676 print(myDouble.rounded()) //13