我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
当前回答
这是基于@Ryu的回答
只要你在一个用圆点作为分隔符的国家,他的解决方案就很好。默认情况下NSNumberFormatter使用设备区域设置。因此,在所有使用逗号作为默认分隔符的国家(包括法国的@PeterK),这将失败。如果数字使用点作为分隔符(通常情况下)。要将这个NSNumberFormatter的区域设置为US,并使用圆点作为分隔符替换行
return NSNumberFormatter().numberFromString(self)?.doubleValue
with
let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
return numberFormatter.numberFromString(self)?.doubleValue
因此,完整的代码变成
extension String {
func toDouble() -> Double? {
let numberFormatter = NSNumberFormatter()
numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
return numberFormatter.numberFromString(self)?.doubleValue
}
}
要使用它,只需调用"Your text goes here".toDouble()
这将返回一个可选的Double?
正如@Ryu提到的,你可以强制展开:
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
}
其他回答
从Swift 1.1开始,你可以直接将String传递给const char *形参。
import Foundation
let str = "123.4567"
let num = atof(str) // -> 123.4567
atof("123.4567fubar") // -> 123.4567
如果你不喜欢deprecated atof:
strtod("765.4321", nil) // -> 765.4321
注意:转换的行为不同于NSString.doubleValue。
Atof和strtod接受0x前缀十六进制字符串:
atof("0xffp-2") // -> 63.75
atof("12.3456e+2") // -> 1,234.56
atof("nan") // -> (not a number)
atof("inf") // -> (+infinity)
如果你更喜欢.doubleValue行为,我们仍然可以使用CFString桥接:
let str = "0xff"
atof(str) // -> 255.0
strtod(str, nil) // -> 255.0
CFStringGetDoubleValue(str) // -> 0.0
(str as NSString).doubleValue // -> 0.0
斯威夫特3
要清除,现在有一个默认的方法:
public init?(_ text: String)` of `Double` class.
它可以用于所有类。
let c = Double("-1.0")
let f = Double("0x1c.6")
let i = Double("inf")
等。
同样有效的方法:
// 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.
我还没找到我想要的答案。 我只是把我的贴在这里,希望它能帮助到任何人。只有在不需要特定格式时,这个答案才有效。
斯威夫特3
extension String {
var toDouble: Double {
return Double(self) ?? 0.0
}
}
我们可以使用CDouble值,它将通过myString.doubleValue获得