2017-02-01 2 views
0

У меня есть двойной:NumberFormatter неправильный результат для 0.9972

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

Что я могу изменить?

ответ

3

Вам просто нужно установить NumberFormatter округления режим свойство .down:

formatter.roundingMode = .down 

Обратите внимание, что вам не нужно создавать новый объект NSNumber, можно смело отбрасывать от Double до NSNumber и как альтернативой вы можете расширить протокол 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" 
+1

большое спасибо –

Смежные вопросы