在 Swift 中将非常长的 Double 转换为 String

Convert very long Double to String in Swift

我想将这个数字 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

但是returns错误的数字12345678901234600000,7没了,又加了2个0

我该如何解决这个问题?

这是由于 Double 的不精确造成的。如果您使用 Decimal,则不会 运行 进入此问题。

您也不需要该解决方法来添加前导 0,您只需将 minimumIntegerDigits 设置为 1。您也不需要转换为 NSNumberNumberFormatter 有一个方法 string(for:) 接受 Swift 数字类型(例如 DoubleDecimal)。

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