从字符串到浮点的JSON转换值
我有一个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
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
,而您的JSONminu 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