我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
我正在尝试用swift语言编写一个BMI程序。 我有这个问题:如何转换字符串为双精度?
在Objective-C中,我可以这样做:
double myDouble = [myString doubleValue];
但是如何在Swift语言中实现这一点呢?
当前回答
同样有效的方法:
// 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.
其他回答
我们可以使用CDouble值,它将通过myString.doubleValue获得
如前所述,实现这一目标的最佳方法是直接铸造:
(myString as NSString).doubleValue
在此基础上,你可以创建一个流畅的本地Swift String扩展:
extension String {
var doubleValue: Double {
return (self as NSString).doubleValue
}
}
这允许你直接使用:
myString.doubleValue
它会帮你选角。如果苹果确实添加了一个doubleValue到本地字符串,你只需要删除扩展和其余的代码将自动编译好!
斯威夫特3
要清除,现在有一个默认的方法:
public init?(_ text: String)` of `Double` class.
它可以用于所有类。
let c = Double("-1.0")
let f = Double("0x1c.6")
let i = Double("inf")
等。
下面是一个扩展方法,允许你简单地调用doubleValue()在一个Swift字符串上,并得到一个双返回(示例输出先来)
println("543.29".doubleValue())
println("543".doubleValue())
println(".29".doubleValue())
println("0.29".doubleValue())
println("-543.29".doubleValue())
println("-543".doubleValue())
println("-.29".doubleValue())
println("-0.29".doubleValue())
//prints
543.29
543.0
0.29
0.29
-543.29
-543.0
-0.29
-0.29
下面是扩展方法:
extension String {
func doubleValue() -> Double
{
let minusAscii: UInt8 = 45
let dotAscii: UInt8 = 46
let zeroAscii: UInt8 = 48
var res = 0.0
let ascii = self.utf8
var whole = [Double]()
var current = ascii.startIndex
let negative = current != ascii.endIndex && ascii[current] == minusAscii
if (negative)
{
current = current.successor()
}
while current != ascii.endIndex && ascii[current] != dotAscii
{
whole.append(Double(ascii[current] - zeroAscii))
current = current.successor()
}
//whole number
var factor: Double = 1
for var i = countElements(whole) - 1; i >= 0; i--
{
res += Double(whole[i]) * factor
factor *= 10
}
//mantissa
if current != ascii.endIndex
{
factor = 0.1
current = current.successor()
while current != ascii.endIndex
{
res += Double(ascii[current] - zeroAscii) * factor
factor *= 0.1
current = current.successor()
}
}
if (negative)
{
res *= -1;
}
return res
}
}
没有错误检查,但如果需要,可以添加它。
我发现更可读添加一个扩展字符串如下:
extension String {
var doubleValue: Double {
return (self as NSString).doubleValue
}
}
然后你就可以写代码了:
myDouble = myString.doubleValue