根据 2015 年冬季斯坦福 CS193p 课程,在 Swift 中从字符串获取双精度的正确方法是使用 NSNumberFormatter 而不是 NSString:
let decimalAsString = "123.45"
let decimalAsDouble = NSNumberFormatter().numberFromString(decimalAsString)!.doubleValue
如果您想要安全(关于可选的展开和小数分隔符),您可以使用:
let decimalAsString = "123.45"
var formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US")
if let decimalAsDoubleUnwrapped = formatter.numberFromString(decimalAsString) {
decimalAsDouble = decimalAsDoubleUnwrapped.doubleValue
}
如果你解析一个 XML 或 JSON 文件并且你需要确保你有一个可以转换为 Double 的字符串,安全解包特别有用(如果你强制解包一个实际上是 nil 的选项,程序会崩溃) .
/!\
编辑:小心,NSNumberFormatter 的工作方式与 NSString 不同。
NSString 允许您执行以下操作:(dictionary[key] as NSString).doubleValue,前提是 dictionary[key] 使用了 '.'作为小数点分隔符(如“123.45”)。
但是 NSNumberFormatter() 默认情况下会使用您当前的系统语言环境初始化 NSNumberFormatter 的实例!
因此,NSNumberFormatter().numberFromString(decimalAsString)!.doubleValue 可以在美国设备上使用 123.45,但不能在法国设备上使用!
例如,如果您正在解析 JSON 文件,并且您知道值是使用 '.' 存储的。作为小数点分隔符,您需要相应地设置 NSNumberFormatter 实例的语言环境:
var formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US")
然后:
let decimalAsString = "123.45"
if let decimalAsDoubleUnwrapped = NSNumberFormatter().numberFromString(decimalAsString) {
decimalAsDouble = decimalAsDoubleUnwrapped.doubleValue
}
在这种情况下,decimalAsDouble 将正确返回 123.45 作为 doubleValue。
但如果 decimalAsString = "123,45",它将返回 nil。
或者如果 NSLocale 设置为“fr_FR”。
另一方面,使用带有 fr_FR 的 NSLocale 的 NSNumberFormatter 可以完美地处理“123,45”,但返回 nil 和“123.45”。
我认为这值得提醒。
我相应地更新了我的答案。
编辑:另外,NSNumberFormatter 不知道如何处理“+2.45%”或“0.1146”之类的东西(您必须非常精确地定义 NSNumberFormatter 实例的属性)。 NSString 本身就可以。