Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中将字符串转换为CGFloat_Swift - Fatal编程技术网

在Swift中将字符串转换为CGFloat

在Swift中将字符串转换为CGFloat,swift,Swift,我是Swift新手,如何将字符串转换为CGFloat 我试过: var fl: CGFloat = str as CGFloat var fl: CGFloat = (CGFloat)str var fl: CGFloat = CGFloat(str) 所有的都没用好问题。实际上,没有任何纯Swift API用于将表示CGFloat的字符串转换为CGFloat。纯Swift允许您转换为数字的唯一表示数字的字符串是整数。您必须使用其他库中的其他方法—例如,从Foundation的NSString

我是Swift新手,如何将字符串转换为CGFloat

我试过:

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

所有的都没用

好问题。实际上,没有任何纯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)

您应该将
string
强制转换为
double
,然后从
double
强制转换为
CGFloat
,让我们尝试以下操作:

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

如果您希望以安全的方式执行此操作,以下是一种可能性:

let str = "32.4"
if let n = NSNumberFormatter().numberFromString(str) {
    let f = CGFloat(n)
}
如果将
str
更改为“bob”,它将不会转换为浮点,而大多数其他答案将转换为0.0

对于Swift 3.0,我会这样做:

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

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

let str = "32.4"
guard let n = NumberFormatter().number(from: str) else { return }

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

例如:

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

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

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

3.14159274101257
3.141592654

从Swift 2.0开始,
Double
类型有一个可接受
字符串的失败初始值设定项。因此,从
String
CGFloat
最安全的方法是:

let string = "1.23456"
var cgFloat: CGFloat?

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

// cgFloat will be nil if string cannot be converted
如果必须经常这样做,可以向
字符串添加扩展方法:

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))
let pi = CGFloat(Double("3.14") ?? 0)

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

extension CGFloat {

    init?(string: String) {

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

        self.init(number.floatValue)
    }

}

像这样使用它
让x=CGFloat(xString)
简单的单线解决方案:

let fl = CGFloat((str as NSString).floatValue))
let pi = CGFloat(Double("3.14") ?? 0)


脸掌。我很感激你的回答,但是有没有黑客可以这么做?(即代码)。从javascript开始,这里就像回到了18世纪。
NSNumberFormatter
也是一种可能性,尽管我怀疑它是否有效。不安全:
CGFloat(formatter.numberFromString(“23.4”)!)
。是的,这是瓦卡瓦马的答案。如果你没注意的话,他是我的人。但你明白我的意思;为了达到这个目的,你正在进入整个可可/基础的机制。它不是“纯粹的”斯威夫特。我认为他们的推理是:可可、基金会和C都在那里,它们不会消失,所以我们不需要建立像JavaScript或Ruby这样的大语言。“有趣的是,我从来没有认为基金会不是“纯粹”的SWIFT,但我明白你的观点并同意。这个缺点是:<代码>(STR为NSCORT)。.floatValue
为它不理解的字符串(如“bob”)提供0。这可能是一个特性,也可能是一个bug,具体取决于您的需求。如果我接受了不可信的输入,我不会使用这个方法。相反,我会使用
NSNumberFormatter
或类似的方法。公平地说,我更喜欢你。实际上,我会等待投票决定谁得到答案。谢谢。你需要处理国际用户吗?(例如,在德国中,逗号被用作小数分隔符。)如果是这样,考虑使用<代码> NSNumberFormatter < /代码>,它将使用设备的国际化设置来处理用户首选格式中的数字。谢谢,但国际化不是问题,其他答案的HeNeNon处理国际用户输入。如果这个字符串是从用户输入的,那么应该使用
区域设置
-特定的答案,比如这个(或者
NSScanner
),我甚至没有想到本地化。(让我们面对它,即使是最好的程序员也经常不考虑。)你是对的。在SWIFT 4中似乎没有<代码> NSNumberFormatter <代码>。<代码>数字格式格式化程序< /Cl> > Swift 4CGLoad(截断:n)从浮点到CG浮动可以导致精度的损失(用0.57尝试)。从double到CGFloat保持正确的值。@Maxwell现在。在将来,可能需要考虑额外的浮点类型。此外,有一个很好的理由是
CGFloat
取代了
float
double
:它在32位处理器上运行得更快。依靠IEEE 64位浮点值来保持正确的值充其量是短视的。请注意NumberFormatter,因为其行为取决于当前的LocaleIt。如果您编辑您的答案来解释这是如何解决原始问题的,并且比现有的答案集合要好得多。