Конвертировать очень длинный Double в String в Swift - PullRequest
0 голосов
/ 24 июня 2019

Я хочу преобразовать это число 12345678901234567000.0 в строку, поэтому я написал расширение ниже.

extension Double {
    var clean: String {
        let formatter = NumberFormatter()
        let number = NSNumber(value: self)
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = 16
        let cleanedString = String(formatter.string(from: number) ?? "")
        if let firstLetter = cleanedString.first, firstLetter == "." {
            return "0\(cleanedString)"
        }
        return cleanedString
    }
}


let number = 12345678901234567000.0
print(number.clean) // output is 12345678901234600000

Но он возвращает неправильный номер 12345678901234600000, 7 пропало и добавлено еще 2 нуля.

Как я могу решить это?

1 Ответ

1 голос
/ 24 июня 2019

Это связано с неточностью 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
...