Это связано с неточностью Double
. Если вы используете Decimal
, вы не столкнетесь с этой проблемой.
Вам также не нужен этот обходной путь для добавления ведущего 0
, вам просто нужно установить minimumIntegerDigits
в 1. Вам также не нужно преобразовывать в NSNumber
, NumberFormatter
имеет метод string(for:)
который принимает Swift
числовые типы (например, Double
или Decimal
).
extension Decimal {
static let cleanFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 16
formatter.minimumIntegerDigits = 1
return formatter
}()
var clean: String {
let cleanedString = Decimal.cleanFormatter.string(for: self) ?? ""
return cleanedString
}
}
let decimalNum = Decimal(string: "12345678901234567000.0")!
decimalNum.clean // "12345678901234567000"
decimalNum.clean == "12345678901234567000" // true