2017-02-01 24 views
0

我有一個雙:的NumberFormatter錯誤的結果爲0.9972

let value = 0.99720317490866084 

和雙extention功能:

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

我可以改變什麼?

回答

3

你只需要設置你的NumberFormatter舍入模式屬性.down:

formatter.roundingMode = .down 

請注意,您並不需要創建一個新的NSNumber對象,你可以安全地從雙轉換爲NSNumber的,並作爲替代方案您可以擴展協議FloatingPoint,使其可用於所有浮點類型:

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" 
+1

非常感謝您 –