Created
March 12, 2016 15:04
-
-
Save ericdke/79b99ec5afebdce293c5 to your computer and use it in GitHub Desktop.
NSNumberFormatter subclass to express weight down to the microgram
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // http://stackoverflow.com/a/35959239/2227743 | |
| enum MassUnit: Double { | |
| case Microgram = 1e-6 | |
| case Milligram = 1e-3 | |
| case Gram = 1 | |
| case Kilogram = 1e3 | |
| static let allUnits: [MassUnit] = [.Microgram, .Milligram, .Gram, .Kilogram] | |
| var unitAbbreviation: String { | |
| get { | |
| switch self { | |
| case .Microgram: return "mcg" | |
| case .Milligram: return "mg" | |
| case .Gram: return "g" | |
| case .Kilogram: return "kg" | |
| } | |
| } | |
| } | |
| } | |
| class MyMassFormatter: NSNumberFormatter { | |
| func bestFitStringForWeightInGrams(weight: Double) -> String { | |
| var selectedString = self.stringFromNumber(weight)! | |
| var selectedUnit = MassUnit.Gram | |
| // Pick the unit that results in the shortest string | |
| for unit in MassUnit.allUnits { | |
| if let str = self.stringFromNumber(weight / unit.rawValue) | |
| where str.characters.count < selectedString.characters.count { | |
| selectedString = str | |
| selectedUnit = unit | |
| } | |
| } | |
| return selectedString + selectedUnit.unitAbbreviation | |
| } | |
| } | |
| let formatter = MyMassFormatter() | |
| formatter.format = "0.######" | |
| print(formatter.bestFitStringForWeightInGrams(0.000001)) // 1mcg | |
| print(formatter.bestFitStringForWeightInGrams(0.005)) // 5mg | |
| print(formatter.bestFitStringForWeightInGrams(2500)) // 2.5kg | |
| print(formatter.bestFitStringForWeightInGrams(1234.5)) // 1234.5g |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment