在Swift中将String转换为CGFloat

for*_*yez 54 swift

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

我试过了:

var fl: CGFloat = str as CGFloat
var fl: CGFloat = (CGFloat)str
var fl: CGFloat = CGFloat(str)
Run Code Online (Sandbox Code Playgroud)

一切都行不通

Gre*_*ley 117

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

let str = "32.4"
if let n = NSNumberFormatter().numberFromString(str) {
    let f = CGFloat(n)
}
Run Code Online (Sandbox Code Playgroud)

如果您更改str为"bob",它将不会转换为浮点数,而大多数其他答案将变为0.0.

对于Swift 3.0,我会做这样的事情:

let str = "32.4"
guard let n = NSNumberFormatter().number(from: str) else { return }
// Use `n` here
Run Code Online (Sandbox Code Playgroud)

在Swift 4中,NSNumberFormatter已重命名为NumberFormatter:

let str = "32.4"
guard let n = NumberFormatter().number(from: str) else { return }
Run Code Online (Sandbox Code Playgroud)

  • CGFloat(截断:n) (2认同)

Mic*_*ire 20

从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
Run Code Online (Sandbox Code Playgroud)

如果您经常这样做,可以添加扩展方法String:

extension String {

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

    return CGFloat(doubleValue)
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您应该返回a,CGFloat?因为操作可能会失败.


小智 15

你应该转换stringdouble然后转换doubleCGFloat,试试这个:

let fl: CGFloat = CGFloat((str as NSString).doubleValue)
Run Code Online (Sandbox Code Playgroud)

  • 从 float 到 CGFloat 可能会导致精度损失(尝试使用 0.57)。从 double 到 CGFloat 可以保持正确的值。 (2认同)

vac*_*ama 14

这有效:

let str = "3.141592654"
let fl = CGFloat((str as NSString).floatValue)
Run Code Online (Sandbox Code Playgroud)

  • 这样做的缺点是`(str as NSString).floatValue`为它不理解的字符串赋予0,比如"bob".根据您的要求,这可能是一个功能或错误.如果我接受不受信任的输入,我不会使用此方法.相反,我会使用`NSNumberFormatter'等. (2认同)

Art*_*nko 11

简单的一行解决方案:

let pi = CGFloat(Double("3.14") ?? 0)
Run Code Online (Sandbox Code Playgroud)


jos*_*405 9

在Swift 3.0中

if let n = NumberFormatter().number(from: string) {
  let f = CGFloat(n)
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您确定该字符串符合所有要求

let n = CGFloat(NumberFormatter().number(from: string)!)
Run Code Online (Sandbox Code Playgroud)


Unh*_*lig 5

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

例如:

let str = "3.141592654"
let foo = CGFloat((str as NSString).floatValue)
Run Code Online (Sandbox Code Playgroud)

结果:

3.14159274101257
Run Code Online (Sandbox Code Playgroud)

要从字符串中获取正确的值,请尝试以下操作:

let str : String = "3.141592654"
let secStr : NSString = str as NSString
let flt : CGFloat = CGFloat(secStr.doubleValue)
Run Code Online (Sandbox Code Playgroud)

结果:

3.141592654
Run Code Online (Sandbox Code Playgroud)


Mar*_*ges 5

您可以进行扩展,以将初始化添加到CGFloat

extension CGFloat {

    init?(string: String) {

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

        self.init(number.floatValue)
    }

}
Run Code Online (Sandbox Code Playgroud)

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

  • 请小心 NumberFormatter,因为其行为取决于当前的区域设置 (2认同)