NumberFormatter错误结果为0.9972

时间:2017-02-01 06:26:09

标签: ios swift nsstring nsnumber nsnumberformatter

我有一双:

let value = 0.99720317490866084

双重延伸功能:

extension Double {
    func stringWithFixedFractionDigits(min: Int, max: Int) -> String {
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = min
        formatter.maximumFractionDigits = max
        formatter.minimumIntegerDigits = 1
        let numberObject = NSNumber(value: self)
        return formatter.string(from: numberObject) ?? "\(self)"
    }
}

如果我使用:

value.stringWithFixedFractionDigits(min: 2, max: 2)

我得1.00,但我想获得0.99

我可以改变什么?

1 个答案:

答案 0 :(得分:3)

您只需将NumberFormatter舍入模式属性设置为.down:

formatter.roundingMode = .down

请注意,您不需要创建新的NSNumber对象,您可以安全地从Double转换为NSNumber或使用string(for: Any)方法。作为替代方案,您可以扩展协议FloatingPoint以使其可用于所有Float类型:

extension Formatter {
    static let number = NumberFormatter()
}
extension FloatingPoint {
    func formattedWithFractionDigits(minimum: Int = 2, maximum: Int = 2, minimumIntegerDigits: Int = 1, roundingMode: NumberFormatter.RoundingMode = .ceiling) -> String {
        Formatter.number.roundingMode = roundingMode
        Formatter.number.minimumFractionDigits = minimum
        Formatter.number.maximumFractionDigits = maximum
        Formatter.number.minimumIntegerDigits = minimumIntegerDigits
        return Formatter.number.string(for: self) ?? ""
    }
}


0.9972031749.formattedWithFractionDigits()                                              // 1.00
0.9972031749.formattedWithFractionDigits(roundingMode: .down)                           // "0.99"
0.9972031749.formattedWithFractionDigits(minimumIntegerDigits: 0, roundingMode: .down)  // ".99"