在Swift中将字符串转换为CGFloat
我是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
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。如果您编辑您的答案来解释这是如何解决原始问题的,并且比现有的答案集合要好得多。