在 Swift 中将字符串转换为 CGFloat

我是 Swift 的新手,如何将 String 转换为 CGFloat?

我试过:

var fl: CGFloat = str as CGFloat
var fl: CGFloat = (CGFloat)str
var fl: CGFloat = CGFloat(str)

都没成功

54728 次浏览

问得好。实际上,并没有 任何纯 Swift API 用于将表示 CGFloat 的字符串转换为 CGFloat。纯 Swift 只允许将字符串表示的数字转换为整数。您必须使用来自其他库的一些其他方法-例如,从 Foundation 的 NSString 或 C (Darwin 的) strtod开始。

这种方法是有效的:

let str = "3.141592654"
let fl = CGFloat((str as NSString).floatValue)

这是一种解决方案,但是您可以将其强制转换为 NSString,然后获取浮点值,然后从该值初始化 CGFloat。例如:

let str = "1.02345332"
let foo = CGFloat((str as NSString).floatValue)

你应该从 stringdouble,然后从 doubleCGFloat,让我们试试这个:

let fl: CGFloat = CGFloat((str as NSString).doubleValue)

如果你想要一个安全的方法来做到这一点,这里有一个可能性:

let str = "32.4"
if let n = NumberFormatter().number(from: str) {
let f = CGFloat(truncating: n)
}

如果你把 str改成“ bob”,它不会被转换成浮点数,而大多数其他的答案会被转换成0.0

旁注 : 还要记住,小数点可以是逗号或句号。您可能希望在数字格式化程序中指定它

let formatter = NumberFormatter()
formatter.decimalSeparator = "." // or ","


// use formatter (e.g. formatter.number(from:))

虽然其他的答案是正确的,但是您看到的结果将有小数的尾随。

例如:

let str = "3.141592654"
let foo = CGFloat((str as NSString).floatValue)

结果:

3.14159274101257

若要从字符串返回正确的值,请尝试以下操作:

let str : String = "3.141592654"
let secStr : NSString = str as NSString
let flt : CGFloat = CGFloat(secStr.doubleValue)

结果:

3.141592654

在 Swift 2.0中,Double类型有一个可以接受 String的失败初始化器。因此,从 StringCGFloat最安全的方法是:

let string = "1.23456"
var cgFloat: CGFloat?


if let doubleValue = Double(string) {
cgFloat = CGFloat(doubleValue)
}


// cgFloat will be nil if string cannot be converted

如果必须经常这样做,可以向 String添加一个扩展方法:

extension String {


func CGFloatValue() -> CGFloat? {
guard let doubleValue = Double(self) else {
return nil
}


return CGFloat(doubleValue)
}
}

注意,应该返回 CGFloat?,因为操作可能会失败。

在 Swift 3.0中

if let n = NumberFormatter().number(from: string) {
let f = CGFloat(n)
}

或者,如果您确信该字符串满足所有要求,则为

let n = CGFloat(NumberFormatter().number(from: string)!)

在 Swift 3.1中

if let n = NumberFormatter().number(from: string) {
let fl = CGFloat(n)
}

或:

let fl = CGFloat((str as NSString).floatValue))

您可以创建一个扩展,将 init 添加到 CGFloat

extension CGFloat {


init?(string: String) {


guard let number = NumberFormatter().number(from: string) else {
return nil
}


self.init(number.floatValue)
}


}

像这样使用 let x = CGFloat(xString)

简单的一行解决方案:

let pi = CGFloat(Double("3.14") ?? 0)
let myFloatNumber = CGFloat("4.22")