检查字符串是否为有效的双精度值在Swift中。

13 浏览
0 Comments

检查字符串是否为有效的双精度值在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 {

// 告诉用户该值无效

}

0
0 Comments

在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,则说明字符串是有效的双精度值。

0
0 Comments

在Swift中,有时候我们需要检查一个字符串是否可以转换为有效的浮点数(double)值。为了满足这个需求,有人提供了一种方法来检查字符串是否为有效的整数(isInt)、浮点数(isFloat)和双精度浮点数(isDouble)值。然而,有人对这种方法的实现提出了一些疑问,并提出了一种更好的实现方式。

首先,有人认为为什么不直接返回false呢?或者当然也可以返回true。他们认为这样的实现更简洁明了。

然后,有人提供了一种使用计算属性的改进实现方式。他们认为将这些方法改为计算属性,通过判断是否等于nil来返回布尔值,可以使代码更加简洁。

接着,有人对为什么将所有负数都返回false提出了疑问。他们认为只需要判断是否等于nil即可,没有必要将所有负数都返回false。

最后,有人提供了一种使用计算属性和getter的改进实现方式。他们认为可以将这些方法改为只读的计算属性,通过getter返回是否等于nil的结果。

这些讨论涉及了如何在Swift中检查字符串是否为有效的双精度浮点数值的问题,以及不同人对于方法实现的改进和优化的观点。无论采用哪种实现方式,都可以实现这一功能。

0
0 Comments

问题的原因是想要检查一个字符串是否是一个有效的双精度值,即能否将该字符串转换为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)

0