有没有一种简单的方法可以在 Swift 中将 float 或 double 显示到相关的小数位数。
例如,一个使用 SI 单位的 iOS 应用程序,可以根据所需的属性进行更改,并根据所需的输入和输出转换多达 6 个数量级。因此,它不仅需要显示 1 毫克到 1000 微克,还需要显示相反的值 - 即 1 微克 = 0.001 毫克。
我可以很容易地格式化一个字符串,如下所示:
textFieldFoo.text = NSString(format: "%.1f mg", bar) as String
但是,如果用户要将 1mcg 转换为 0.001mg,这将显示为 0.0毫克
然而,包含最多 6 位小数以包含所有常见可能性会导致 UI 笨重、难看。
是否有一种简单的方法来格式化字符串,以便在显示到相关小数位数/有效数字的位置包含 float / double ?我敢肯定,如果有时间和足够的样板代码,我可以将 if/else 金字塔形化以获得结果,但坦率地说,这并不优雅。
最佳答案
有 NSMAssFormatter
但它并没有一直精确到微克。它旨在格式化人类体重。
你可以通过子类化 NSNumberFormatter
来推出你自己的:
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
关于xcode - 在 Swift 中将 float 显示为可变的小数位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951144/