xcode - 在 Swift 中将 float 显示为可变的小数位数

标签 xcode swift

有没有一种简单的方法可以在 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/

相关文章:

ios - 将iOS中的一列JSON文件解析为数组?

ios - iPad 中的 PDF 搜索和突出显示

ios - 将单元测试移动到 xcode 中的不同文件夹

ios - 使用 Swift Argo 框架 : Could not find an overload for '<*>'

ios - 应用旋转时自定义相机 View 覆盖尺寸问题

ios - 错误 ITMS-90207 bundle 无效

ios - 局部变量不会复制到全局变量(swift)

swift - 闭包中的无主 self

swift - 不同 Controller 的页面控制或 ScrollView

cocoa - 带有核心数据的基于文档的应用程序与普通核心数据应用程序?