Swift 3.0将String转换为Double返回nil?

时间:2017-01-07 06:18:46

标签: json string null swift3 double

尝试做一些如此简单的事情,但它根本不适合我。

CODE:

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)

DEBUG OUTPUT:

-85.1113644443208 
32.880541654362 
nil

^^^为什么这么零?我将添加这是从JSON响应中提取的。也许这与它有关。

2 个答案:

答案 0 :(得分:5)

您的数据中很可能还有一个空格,请注意:

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)

答案 1 :(得分:0)

有一些新的可用初始值设定项允许你以更惯用和更安全的方式执行此操作(正如许多答案所指出的,String的double值不是很安全,因为它为非数值返回0。这意味着doubleValue为“ foo“和”0“是相同的。)

让myDouble = Double(myString)

这会返回一个可选项,因此在传递“foo”的情况下,其中doubleValue将返回0,可用的初始化程序将返回nil。您可以使用guard,if-let或map来处理Optional