check string是int或double,扩展名为swift 3

Swi*_*per 0 string swift

我有下面的字符串扩展名,但只有Int返回true ,我想返回true,仅适用于All,IntDouble值.

extension String  {
    var isnumberordouble : Bool {
        get{
            return self.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决?任何的想法 ?TY.

vac*_*ama 6

正如@MartinR所说,检查字符串是否可以转换为a Int或a Double:

extension String  {
    var isnumberordouble: Bool { return Int(self) != nil || Double(self) != nil }
}

print("1".isnumberordouble)      // true
print("1.2.3".isnumberordouble)  // false
print("1.2".isnumberordouble)    // true
Run Code Online (Sandbox Code Playgroud)

@MartinR在评论中提出了一个很好的观点.任何Int转换为a的值也会转换为a Double,因此只需检查转换Double就足够了:

extension String  {
    var isnumberordouble: Bool { return Double(self) != nil }
}
Run Code Online (Sandbox Code Playgroud)

处理前导和尾随空格

上面的解决方案有效,但如果你String有前导空格或尾随空格,那就不是很宽容了.要处理它,请使用删除空格的trimmingCharacters(in:)方法String(需要Foundation):

import Foundation

extension String  {
    var isnumberordouble: Bool { return Double(self.trimmingCharacters(in: .whitespaces)) != nil }
}

print("  12 ".isnumberordouble)     // true
Run Code Online (Sandbox Code Playgroud)

  • 检查Double可能就足够了......表示整数的字符串也应该是有效的double. (2认同)