Swift - Remove Trailing Zeros From Double
In Swift 4 you can do it like that:
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) ?? "") }}
example of use: print (Double("128834.567891000").removeZerosFromEnd())
result: 128834.567891
You can also count how many decimal digits has your string:
import Foundationextension 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) ?? "") }}
Removing trailing zeros in output
This scenario is good when the default output precision is desired. We test the value for potential trailing zeros, and we use a different output format depending on it.
extension Double { var stringWithoutZeroFraction: String { return truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self) }}
(works also with extension Float
, but not Float80
)
Output:
1.0 → "1"
0.1 → "0.1"
0.01 → "0.01"
0.001 → "0.001"
0.0001 → "0.0001"
Formatting with maximum fraction digits, without trailing zeros
This scenario is good when a custom output precision is desired.This solution seems roughly as fast as NumberFormatter + NSNumber solution from MirekE, but one benefit could be that we're avoiding NSObject here.
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)]) }}
(works also with extension Float
, but not Float80
)
Output for maximumFractionDigits: 2
:
1.0 → "1"
0.12 → "0.12"
0.012 → "0.01"
0.0012 → "0"
0.00012 → "0"
Note that it performs a rounding (same as MirekE solution):
0.9950000 → "0.99"
0.9950001 → "1"