【问题标题】:Convert very long Double to String in Swift在 Swift 中将非常长的 Double 转换为 String
【发布时间】:2019-06-24 10:06:28
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: swift string type-conversion double nsnumberformatter


    【解决方案1】:

    这是由于Double 的不精确性。如果您使用Decimal,则不会遇到此问题。

    您也不需要该解决方法来添加前导0,您只需将minimumIntegerDigits 设置为1。您也不需要转换为NSNumberNumberFormatter 有一个方法@987654328 @ 接受 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
    

    【讨论】:

    • 这将在您每次调用此属性时创建一个新的数字格式化程序。顺便说一句string(for:) 它不是 NumberFormatter 类的实例方法。它是 Formatter 抽象类的实例方法。 developer.apple.com/documentation/foundation/formatter/…
    • @LeoDabus 你是对的,我只修复了必要的部分。用static NumberFormatter 更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多