检查字符串是否是Swift中的有效double值

Mic*_*ola 10 string double swift

在Swift中,如何检查字符串是否是有效的double值?我一直在使用此问题的以下扩展(但作为一个浮点数),但如果无法转换该值,它只返回"0":

extension String {
    var doubleValue:Double? {
        return (self as NSString).doubleValue
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望它返回nil所以它可以被捕获if-let,如下所示:

if let i = str.doubleValue {
    object.price = i
} else {
    // Tell user the value is invalid
}
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 24

编辑/更新:Xcode 9或更高版本•Swift 4或更高版本

您可以使用Double initialiser StringProtocol创建扩展并使用它来检查您的字符串是否为有效的double,如下所示:

extension StringProtocol {
    var double: Double? {
        return Double(self)
    }
    var float: Float? {
        return Float(self)
    }
    var integer: Int? {
        return Int(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

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
Run Code Online (Sandbox Code Playgroud)

  • 我建议您缓存NSNumberFormatter,如果您经常使用此方法(例如在tableViewCell上),您将从缓存中获益. (3认同)

and*_*iys 14

每次进行转换时,不创建数字格式器确实更有效:

extension String {
     struct NumFormatter {
         static let instance = NumberFormatter()
     }

     var doubleValue: Double? {
         return NumFormatter.instance.number(from: self)?.doubleValue
     }

     var integerValue: Int? {
         return NumFormatter.instance.number(from: self)?.intValue
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果走这条路线,有什么理由不让结构成为整个类扩展的第一类成员?然后你可以很容易地扩展字符串以支持`integerValue`,`boolValue`等,并共享相同的`Formatter`. (2认同)