尝试做一些如此简单的事情,但它根本不适合我。
法典:
let long = index["Longitude"] as! String
let lat = index["Latitude"] as! String
print(long as Any)
print(lat as Any)
let doubleLong = Double(long)
print(doubleLong as Any)
调试输出:
-85.1113644443208
32.880541654362
nil
^^^ 为什么这么零?我要补充一点,这是从 JSON 响应中提取的。也许这与它有关。
您的数据中很可能有一个额外的空间,请注意:
print(Double("-85.1113644443208")) // => Optional(-85.111364444320799)
print(Double("-85.1113644443208 ")) // => nil
print(Double(" -85.1113644443208")) // => nil
尝试先修剪空格:
let doubleLong = Double(long.trimmingCharacters(in: CharacterSet.whitespaces))
或使用NumberFormatter
进行解析:
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.locale = Locale(identifier: "en_US_POSIX")
print(numberFormatter.number(from: "-85.1113644443208") as Double?) // => Optional(-85.111364444320799)
print(numberFormatter.number(from: " -85.1113644443208") as Double?) // => Optional(-85.111364444320799)
print(numberFormatter.number(from: "-85.1113644443208 ") as Double?) // => Optional(-85.111364444320799)
有新的可失败初始值设定项允许您以更惯用和安全的方式执行此操作(正如许多答案所指出的那样,String 的双精度值不是很安全,因为它为非数字值返回 0。这意味着 "foo" 和 "0" 的双精度值相同。
让 myDouble = Double(myString)
这将返回一个可选,因此在传递 "foo" 的情况下,doubleValue 将返回 0,可失败的初始化器将返回 nil。您可以使用守卫、if-let 或映射来处理可选