从字符串到浮点的JSON转换值

从字符串到浮点的JSON转换值,json,swift,Json,Swift,我有一个Json(作为文本接收),我将其转换为: if let jsonData = raw.data(using: String.Encoding.utf8) { if let json = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) { let products = json["products"] as! [Dictionary<String

我有一个Json(作为文本接收),我将其转换为:

if let jsonData = raw.data(using: String.Encoding.utf8) {
   if let json = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) {
      let products = json["products"] as! [Dictionary<String, AnyObject>]

但是,当我试图在我的代码中访问它时(我想将它作为一个浮点读取,如果它是1或0.01,则独立读取),我得到以下结果:

let k = item["min_size"] // contains > ▿ Optional<Any> - some : 0.01
let i = item["min_size"] as? Float // contains > nil
let j = item["min_size"] as? Int // contains > nil

let y = item["min_size"] as? NSString // contains > "0.01"
let z = y!.floatValue // contains > "0.009999997"
k=item[“min_size”]//包含>▿ 可选-部分:0.01
设i=项目[“最小尺寸”]为?浮点//包含>零
设j=项目[“最小尺寸”]为?Int//contains>nil
设y=项目[“最小尺寸”]为?NSString//包含>“0.01”
设z=y!。floatValue//contains>“0.00999997”
我是新来的斯威夫特,我不明白这里发生了什么

  • 为什么我不能直接将值(1或0.01)强制转换为浮动
  • 如果没有,我可以做什么来获取此字段的浮点数
  • 最 对我来说很奇怪。。。为什么要将NSString转换为“0.01” 值与floatValue,结果是否不同?四舍五入不是一个好办法 选项,因为它也可能是一个很长的小数点。它可以是任何十进制或整数

知道我做错了什么吗?

根据评论中的建议,我实施的解决方案是:

let min_size = (item["min_size"] as? String ?? "").convertFromJSONStringToFloat()
这里我有两个字符串和Float的扩展名

extension String {
    func convertFromJSONStringToFloat() -> Float? {
        let partNumber = self.split(separator: ".")
        return (Float(self)?.roundToDecimal((partNumber.count > 1) ? partNumber[1].count : 1))!
    }
}

extension Float {
    func roundToDecimal(_ fractionDigits: Int) -> Float {
        let multiplier = pow(10, Double(fractionDigits))
        return Float((Double(self) * multiplier) / multiplier)
    }
}

您的字典的值类型为
AnyObject
,而您的JSON
minu size
值是
字符串
,您可以将
字符串
转换为
浮点
,如果它不存在,则提供默认值:

let y = Float(item["min_size"] as? String ?? "0") ?? 0

您不能从字符串转换为某些数字类型,您需要转换为数字类型,例如
let i=Float(item[“min_size”]??“”)
它周围有双引号,因此它是
字符串。您不能这样强制转换它,您需要阅读如何从
String
转换为
Float
。剩下的是精度问题,比如:swift不能允许一个变量分配两个数据类型。所以您需要在两侧使用CGFloat,并假设值为1.0&0.01。我的示例应该包含一个
as?
??
前面的字符串。
extension String {
    func convertFromJSONStringToFloat() -> Float? {
        let partNumber = self.split(separator: ".")
        return (Float(self)?.roundToDecimal((partNumber.count > 1) ? partNumber[1].count : 1))!
    }
}

extension Float {
    func roundToDecimal(_ fractionDigits: Int) -> Float {
        let multiplier = pow(10, Double(fractionDigits))
        return Float((Double(self) * multiplier) / multiplier)
    }
}
let y = Float(item["min_size"] as? String ?? "0") ?? 0