Как бы я декодировал NSDecimalNumber без потери точности? - PullRequest
1 голос
/ 28 июня 2019

есть ли способ сказать JSONDecoder преобразовать входящие десятичные дроби в Строки

 public struct Transaction: Decodable
 {
    public let total: NSDecimalNumber?


    enum CodingKeys: String, CodingKey {
        case total = "AMOUNT"

    }

    public init(from decoder: Decoder) throws
    {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        let total = try values.decode(Decimal.self, forKey: .total)
        self.total = NSDecimalNumber(decimal: total);
    }

 }

Подумайте, что произойдет, когда AMOUNT будет выглядеть примерно так: 397289527598234759823475455622342424358363514.42

Я полагаю, что с кодом, который у меня есть, я получу исключение nonConformingFloatDecodingStrategy без возможности восстановления из этого или потеря точности.

Борьба вокруг идиотского стремительного десятичного числа задокументирована по всей стране. в частности здесь:

Создание NSDecimalNumber Codable

1 Ответ

4 голосов
/ 28 июня 2019

Проблема в том, что JSONDecoder - это просто обертка вокруг JSONSerialization, которая декодирует десятичные числа в Double внутри и только после того, как преобразует их в Decimal.К сожалению, если вы не создадите свой собственный JSON-декодер, вы не сможете обойти эту проблему при использовании числовых десятичных знаков из JSON.

Единственный возможный обходной путь, который в настоящее время возможен, - это изменить свой бэкэнд для отправки всех десятичных чисел как String s изатем конвертируйте их в Decimal с после их декодирования как String с.

Для получения дополнительной информации посмотрите на эту открытую ошибку Swift: SR-7054 .

...