检查字符串是否为有效的双精度值在Swift中。
检查字符串是否为有效的双精度值在Swift中。
在Swift中,如何检查一个字符串是否为有效的双精度值?我一直在使用来自这个问题的以下扩展(但作为浮点数),但如果值无法转换,它只会返回"0":
extension String {
var doubleValue:Double? {
return (self as NSString).doubleValue
}
}
理想情况下,我希望它返回nil
,这样可以在if-let
中捕获,如下所示:
if let i = str.doubleValue {
object.price = i
} else {
// 告诉用户该值无效
}
在Swift中,判断一个字符串是否为有效的双精度值是一个常见的需求。为了提高效率,可以避免每次转换时都创建一个数字格式化器。可以通过将数字格式化器定义为String的扩展来实现这一点。代码如下:
extension String {
struct NumFormatter {
static let instance = NumberFormatter()
}
var doubleValue: Double? {
return NumFormatter.instance.number(from: self)?.doubleValue
}
}
如果选择这种方式,是否有理由将结构体定义为整个类扩展的一级成员呢?这样你可以轻松地扩展字符串,以支持integerValue、boolValue等,并共享相同的格式化器。
需要注意的是,在Swift 3中,NSNumberFormatter已经更名为NumberFormatter,所以结构体名称会导致错误。只需要将其名称更改为NumberFormatter即可。
需要注意的是,这不是纯Swift的写法,需要导入Foundation框架。
通过以上代码,我们可以判断一个字符串是否为有效的双精度值。只需要调用字符串的doubleValue属性,如果返回值为nil,则说明字符串不是有效的双精度值;如果返回值不为nil,则说明字符串是有效的双精度值。
在Swift中,有时候我们需要检查一个字符串是否可以转换为有效的浮点数(double)值。为了满足这个需求,有人提供了一种方法来检查字符串是否为有效的整数(isInt)、浮点数(isFloat)和双精度浮点数(isDouble)值。然而,有人对这种方法的实现提出了一些疑问,并提出了一种更好的实现方式。
首先,有人认为为什么不直接返回false呢?或者当然也可以返回true。他们认为这样的实现更简洁明了。
然后,有人提供了一种使用计算属性的改进实现方式。他们认为将这些方法改为计算属性,通过判断是否等于nil来返回布尔值,可以使代码更加简洁。
接着,有人对为什么将所有负数都返回false提出了疑问。他们认为只需要判断是否等于nil即可,没有必要将所有负数都返回false。
最后,有人提供了一种使用计算属性和getter的改进实现方式。他们认为可以将这些方法改为只读的计算属性,通过getter返回是否等于nil的结果。
这些讨论涉及了如何在Swift中检查字符串是否为有效的双精度浮点数值的问题,以及不同人对于方法实现的改进和优化的观点。无论采用哪种实现方式,都可以实现这一功能。
问题的原因是想要检查一个字符串是否是一个有效的双精度值,即能否将该字符串转换为Double类型。解决方法是使用Double的初始化器init?(_ text: S) where S : StringProtocol来创建一个StringProtocol的实例属性,并用它来检查一个String或Substring是否是一个有效的Double值。同时还可以使用类似的方法来检查String是否是一个有效的Float值或整数值。
具体代码如下:
extension StringProtocol {
var double: Double? { Double(self) }
var float: Float? { Float(self) }
var integer: Int? { Int(self) }
}
测试代码如下:
let str = "2.9"
if let value = str.double {
print(value) // "2.9\n"
} else {
print("invalid input")
}
str.prefix(1).integer // 2
str.suffix(1).integer // 9
此外,建议在使用这种方法的情况下缓存NSNumberFormatter,这样可以提高性能。可以通过什么方式来缓存呢?这个问题在Swift 1中提出,当时还没有Double(_ string:)初始化器。这个答案展示了如何在Swift 3.x及更高版本中进行操作。
参考链接:[stackoverflow.com/a/27705739/2303865](https://stackoverflow.com/a/27705739/2303865)