将文本从字符串转换为双精度浮点数
问题的原因是希望将字符串转换为双精度浮点数,并且当字符串不包含双精度浮点数时返回nil。解决方法有两种,一种是使用NSNumberFormatter的numberFromString方法进行转换,另一种是扩展Swift的String类型,添加一个toDouble方法。
第一种方法是使用NSNumberFormatter的numberFromString方法进行转换,代码如下:
let double = NSNumberFormatter().numberFromString(myString)?.doubleValue
这种方法返回一个可选的双精度浮点数Double?,需要进行解包操作。
第二种方法是扩展Swift的String类型,添加一个toDouble方法,代码如下:
extension String {
func toDouble() -> Double? {
return NumberFormatter().number(from: self)?.doubleValue
}
}
使用该方法时可以像使用toInt()方法一样使用toDouble()方法:
var myString = "4.2"
var myDouble = myString.toDouble()
这同样返回一个可选的双精度浮点数Double?,需要进行解包操作。
解包操作可以使用强制解包或者if let语句进行。例如使用强制解包:
println("The value is \(myDouble!)") // 输出: The value is 4.2
或者使用if let语句:
if let myDouble = myDouble {
println("The value is \(myDouble)") // 输出: The value is 4.2
}
另外,为了进行本地化,可以使用NSNumberFormatter的locale属性设置地区,例如:
let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "fr_FR")
let double = formatter.numberFromString("100,25")
最后,如果需要处理带有货币符号的字符串,可以在NSNumberFormatter上使用NSNumberFormatterCurrencyStyle。
对于该问题,某些情况下了使用NSNumberFormatter的好处是,当字符串包含不是双精度浮点数的字符时,numberFromString方法会返回nil,而NSString的doubleValue方法无论如何都会返回一个双精度浮点数(例如"test"返回0.0)。因此,如果需要判断字符串是否仅为双精度浮点数,没有其他字符,使用NSNumberFormatter是更好的选择。
另外,某些情况下这种方法在法国等使用逗号作为分隔符的国家会出错。他们给出了一个修改的解决方案,链接如下:Modified solution。
问题出现的原因:在Swift中,将字符串转换为Double类型的方式有多种,但是有些方法会返回0而不是nil,这可能会导致一些错误。
解决方法:在Swift 2.0中,有一种更安全的方式来将字符串转换为Double类型,即使用Double的可失败初始化器。这样可以避免返回0而导致的错误。代码如下:
let myDouble = Double(myString)
这将返回一个可选值,当传入的字符串无法被转换为Double类型时,会返回nil。可以使用guard、if-let或map来处理Optional
原始文章中还提到了其他的转换方法,例如将Swift的字符串强制转换为NSString类型,再使用NSString的doubleValue方法进行转换。但这种方法的缺点是,如果字符串无法转换为有效的Double类型,将返回0.0而不是nil。
另外,原始文章中还提到了使用Swift的toInt方法进行转换,但是这种方法只适用于将字符串转换为整数类型,无法转换为Double类型。
在Swift中,将字符串转换为Double类型时,应该使用Double的可失败初始化器来避免返回0而导致的错误。其他方法可能会导致一些问题,如将字符串强制转换为NSString类型再使用doubleValue转换方法,或使用toInt方法转换为整数类型。
问题的出现原因:在Swift 4.2+中,将String转换为Double时,推荐使用新的类型初始化器来进行转换,而不是使用NSString的doubleValue属性。因为doubleValue属性在无法转换时会返回0,这可能会导致用户输入错误。
解决方法:可以使用if/let语句对转换后的值进行解包,如果转换成功,则可以使用该值进行操作;如果转换失败,则可以进行相应的错误处理。
另外,还可以使用NumberFormatter类来转换格式化的数字和货币。通过设置NumberFormatter的locale和numberStyle属性,可以将不同格式的数字和货币转换为Double类型。
此外,还可以使用Double(myString) ?? 0.0来避免初始化错误,并使用if/let或guard let结构来进行适当的逻辑处理,以便向用户显示正确的格式错误信息。
将String转换为Double的问题可以通过使用新的类型初始化器、使用NumberFormatter类和合理的逻辑处理来解决。