Making NSDecimalNumber Codable

后端 未结 2 1662
逝去的感伤
逝去的感伤 2021-02-19 23:08

Is it possible to extend NSDecimalNumber to conform Encodable & Decodable protocols?

2条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-02-19 23:56

    It is not possible to extend NSDecimalNumber to conform to Encodable & Decodable protocols. Jordan Rose explains it in the following swift evolution email thread.

    If you need NSDecimalValue type in your API you can build computed property around Decimal.

    struct YourType: Codable {
        var decimalNumber: NSDecimalNumber {
            get { return NSDecimalNumber(decimal: decimalValue) }
            set { decimalValue = newValue.decimalValue }
        }
        private var decimalValue: Decimal
    }
    

    Btw. If you are using NSNumberFormatter for parsing, beware of a known bug that causes precision loss in some cases.

    let f = NumberFormatter()
    f.generatesDecimalNumbers = true
    f.locale = Locale(identifier: "en_US_POSIX")
    let z = f.number(from: "8.3")!
    // z.decimalValue._exponent is not -1
    // z.decimalValue._mantissa is not (83, 0, 0, 0, 0, 0, 0, 0)
    

    Parse strings this way instead:

    NSDecimalNumber(string: "8.3", locale: Locale(identifier: "en_US_POSIX"))
    

提交回复
热议问题