我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
当前回答
在SWIFT 3中,您可以使用:
if let myDouble = NumberFormatter().number(from: yourString)?.doubleValue {
print("My double: \(myDouble)")
}
注意: —如果字符串中包含除数字、适合区域设置的组或小数分隔符以外的任何字符,解析将失败。 —忽略字符串中任何开头或结尾的空格分隔符。例如,字符串“5”、“5”和“5”都产生数字5。
摘自文档: https://developer.apple.com/reference/foundation/numberformatter/1408845-number
其他回答
试试这个:
var myDouble = myString.bridgeToObjectiveC().doubleValue
println(myDouble)
NOTE
在Beta 5中删除。这已经不管用了?
斯威夫特3
要清除,现在有一个默认的方法:
public init?(_ text: String)` of `Double` class.
它可以用于所有类。
let c = Double("-1.0")
let f = Double("0x1c.6")
let i = Double("inf")
等。
你可以使用StringEx。它用字符串到数字的转换扩展了String,包括toDouble()。
extension String {
func toDouble() -> Double?
}
它验证字符串,如果不能转换为double则失败。
例子:
import StringEx
let str = "123.45678"
if let num = str.toDouble() {
println("Number: \(num)")
} else {
println("Invalid string")
}
Swift 2更新 有新的可失败的初始化器,允许你以更习惯和安全的方式来做这件事(正如许多答案所指出的,NSString的double值不是很安全,因为它对非数字值返回0。这意味着"foo"和"0"的doubleValue是相同的。)
let myDouble = Double(myString)
这将返回一个可选值,因此在诸如传入"foo"时doubleValue将返回0,可失败的初始化器将返回nil。您可以使用守卫、if-let或映射来处理Optional<Double>
原来的帖子: 你不需要像接受的答案那样使用NSString构造函数。你可以像这样简单地桥接它:
(swiftString as NSString).doubleValue
如前所述,实现这一目标的最佳方法是直接铸造:
(myString as NSString).doubleValue
在此基础上,你可以创建一个流畅的本地Swift String扩展:
extension String {
var doubleValue: Double {
return (self as NSString).doubleValue
}
}
这允许你直接使用:
myString.doubleValue
它会帮你选角。如果苹果确实添加了一个doubleValue到本地字符串,你只需要删除扩展和其余的代码将自动编译好!