将货币值从JSON转换为NSDecimalNumber

Isu*_*uru 3 double json currency nsdecimalnumber swift

我从API获得以下JSON响应.

{
  "status": "success",
  "data": [
    {
      "actual_price": 30,
      "offered_deal_price": 16,
      "pending_balance": 12.8
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

所有这些价值都是价格.这意味着它们可以是圆值或浮点值.

读过你应该使用NSDecimalNumbertype作为货币值.我在转换这些JSON值时遇到问题.

这样做,

json["pending_balance"] as! NSDecimalNumber
Run Code Online (Sandbox Code Playgroud)

失败,出现以下错误.

无法将'__NSCFNumber'(0x10423ccf0)类型的值转换为'NSDecimalNumber'(0x1046cf1f0)

试图把它投射到NSDecimal这导致了这个

无法将类型'__NSCFNumber'(0x7f9102f79f68)的值转换为'C.NSDecimal'(0x10f23d6e0).

但是,我可以将它转换为Swift类型,Float无论Double是否有问题.

任何人都知道问题是NSDecimalNumber什么?或继续安全FloatDouble?如果是这样哪一个最适合货币价值?

谢谢.

Ant*_*nio 8

该错误表示您正在尝试转换为错误的类型.该值从JSON反序列化为a NSNumber,可无缝桥接到Double本机swift类型.

你应该尝试转换,而不是强制转换:

NSDecimalNumber(decimal: (json["pending_balance"] as! NSNumber).decimalValue)
Run Code Online (Sandbox Code Playgroud)

要么

NSDecimalNumber(double: json["pending_balance"] as! Double)
Run Code Online (Sandbox Code Playgroud)

但可能还有其他方法可以进行转换.

  • 注意:这将解决转换问题,但不解决inprecise浮点表示的原始问题.正确的解决方案是将Swift中的字符串转换为NSDecimalNumber,而不是JS中. (3认同)