我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?

在Objective-C中,我可以这样做:

double myDouble = [myString doubleValue];

但是如何在Swift语言中实现这一点呢?


当前回答

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

其他回答

你可以使用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的感觉,使用NSFormatter()避免转换为NSString,并在字符串不包含Double值时返回nil(例如:"test"不会返回0.0)。

let double = NSNumberFormatter().numberFromString(myString)?.doubleValue

或者,扩展Swift的String类型:

extension String {
    func toDouble() -> Double? {
        return NumberFormatter().number(from: self)?.doubleValue
    }
}

并像toInt()一样使用它:

var myString = "4.2"
var myDouble = myString.toDouble()

这返回一个可选的Double?它必须被打开。

要么是强行打开:

println("The value is \(myDouble!)") // prints: The value is 4.2

或者使用if let语句:

if let myDouble = myDouble {
    println("The value is \(myDouble)") // prints: The value is 4.2
}

更新: 对于本地化,将locale应用到NSFormatter是非常容易的,如下所示:

let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "fr_FR")
let double = formatter.numberFromString("100,25")

最后,你可以使用NSNumberFormatterCurrencyStyle在格式化器上,如果你正在处理包含货币符号的字符串的货币。

斯威夫特:4和5

可能有两种方法:

String -> Int -> Double: let strNumber = "314" if let intFromString = Int(strNumber){ let dobleFromInt = Double(intFromString) 打印(dobleFromInt) } String -> NSString -> Double 让strNumber1 = "314" 让NSstringFromString = NSString(字符串:strNumber1) let doubleFromNSString = NSstringFromString.doubleValue 打印(doubleFromNSString)

使用它,无论你喜欢根据你需要的代码。

具有可选区域设置的扩展

斯威夫特2.2

extension String {
    func toDouble(locale: NSLocale? = nil) -> Double? {
        let formatter = NSNumberFormatter()
        if let locale = locale {
            formatter.locale = locale
        }
        return formatter.numberFromString(self)?.doubleValue
    }
}

斯威夫特3.1

extension String {
    func toDouble(_ locale: Locale) -> Double {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.locale = locale
        formatter.usesGroupingSeparator = true
        if let result = formatter.number(from: self)?.doubleValue {
            return result
        } else {
            return 0
        }
    }
}

同样有效的方法:

// Init default Double variable
var scanned: Double()

let scanner = NSScanner(string: "String to Scan")
scanner.scanDouble(&scanned)

// scanned has now the scanned value if something was found.