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