如何检查文本是否只包含数字?

时间:2016-01-04 08:22:07

标签: ios swift

我尝试了很多案例,但没有一个适合我。我试过了:

if resultTitles[indexPath.row].rangeOfCharacterFromSet(badCharacters) == nil {
    let badCharacters = NSCharacterSet.decimalDigitCharacterSet().invertedSet
    print("Index: \(indexPath.row)")
}

也试过

if ((resultTitles[0].toInt()) != nil) {
    print("ERROR")
}

那么,我如何检查我的文字只包含数字?

12 个答案:

答案 0 :(得分:60)

我发现在Swift 3中这个解决方案更清洁

import Foundation

CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: yourString))

答案 1 :(得分:31)

您只需要检查Set的{​​{1}}字符的String是否为包含0到9字符的Set子集。 / p>

extension String {
    var isNumeric: Bool {
        guard self.characters.count > 0 else { return false }
        let nums: Set<Character> = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
        return Set(self.characters).isSubset(of: nums)
    }
}

"".isNumeric // false
"No numbers here".isNumeric // false
"123".isNumeric // true
"Hello world 123".isNumeric // false

答案 2 :(得分:3)

这取决于您所说的数字。如果您的意思是0-9,则可以使用以下代码:

let numbersSet = CharacterSet(charactersIn: "0123456789")

let textCharacterSet = CharacterSet(charactersIn: "123")

if textCharacterSet.isSubset(of: numbersSet) {
    print("text only contains numbers 0-9")
} else {
    print("text contains invalid characters")
}

如果您要使用各种不同的数字指定方式,则可以使用CharacterSet.decimalDigits,其中包含各种数字指定方式。

答案 3 :(得分:3)

我们必须检查字符串的每个字符是否都是数字,并且字符串不能为空。

extension String {
   var isNumeric: Bool {
     return !(self.isEmpty) && self.allSatisfy { $0.isNumber }
   }
}

allSatisfy(_谓词:(字符)抛出-> Bool)重新抛出-> Bool 是一种返回布尔值的方法,该值指示序列中的每个元素是否满足给定谓词。

以供参考:https://developer.apple.com/documentation/swift/array/2994715-allsatisfy

示例:

  1. let string =“ 123” string.isNumeric ---- 返回true

  2. 让string_One =“ 1 @ 3” string_One.isNumeric ---- 返回false

答案 4 :(得分:2)

试试这个

find ~/.m2  -name "*.lastUpdated" -exec grep -q "Could not transfer" {} \; -print -exec rm {} \;

答案 5 :(得分:2)

在上面Luca的出色著作的基础上,这是由Swift 5给出的答案。

extension String {
    var isNumeric: Bool {
        guard self.count > 0 else { return false }
        let nums: Set<Character> = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
        return Set(self).isSubset(of: nums)
    }
}

答案 6 :(得分:1)

你的第一个选择适合我在操场上。再次检查。假设.edit_text{ cursor: pointer; display: block; height: 34px; position: absolute; top: 35px; width: 246px; z-index: 999; }

str = resultTitles[indexPath.row]

答案 7 :(得分:0)

这可能会对你有帮助。

 let string  = "536783"
    let num = Int(string);

    if num != nil {
        print("Valid Integer")   
    }
    else {
        print("Not Valid Integer")
    }

答案 8 :(得分:0)

我认为最干净的Swift方式是:

extension String {
  var isDigits: Bool {
    guard !self.isEmpty else { return false }
    return !self.contains { Int(String($0)) == nil }
  }
}

"123".isDigits // returns true
"12d".isDigits // returns false

答案 9 :(得分:0)

上面的某些代码仅适用于阿拉伯数字(0、1、2,...)。 但是,它不能与其他数字格式一起使用(例如在阿拉伯国家/地区使用的北印度语,١、٢、٣或在中文中使用的一种数字..)

我已经测试了下面的代码(取自上面的代码,对具有不同数字格式的数字进行了更正(中文,阿拉伯语的印地语,...)。

extension String {

    var isNumeric : Bool { return CharacterSet(charactersIn: self).isSubset(of: CharacterSet.decimalDigits)
    }

    var isDigits : Bool {
        guard !self.isEmpty else { return false }
        let containsNonNumbers = self.contains { !$0.isNumber }
        return !containsNonNumbers
    }
}

答案 10 :(得分:0)

基于“克里斯蒂娜·德·里托”解决方案,这里是一个检查结果的小程序,您可以添加自己的CharacterSet(swift 5)

var arr_IsStringNumberOnly:[String] = ["123", "456.7", "890,1", "1'234", "", "abc", "def3", "xyz 4", "5 äöü"]
for i in 0..<arr_IsStringNumberOnly.count {
    //the code w/o 'nil'
    CharacterSet.init(arrayLiteral: "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ",", ".", "'" ).isSuperset(of: CharacterSet(charactersIn: arr_IsStringNumberOnly[i]))

    //the code with handling 'nil' (nil dosent work in test array)
    //CharacterSet.init(arrayLiteral: "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ",", ".", "'" ).isSuperset(of: CharacterSet(charactersIn: arr_IsStringNumberOnly ?? "abc")) //if empty assume it's text

    //the code with handling 'nil' (nil dosent work in test array)
    //CharacterSet.init(arrayLiteral: "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ",", ".", "'" ).isSuperset(of: CharacterSet(charactersIn: arr_IsStringNumberOnly ?? "123")) //if empty assume it's numeric


    //presentation:
    print("arr_IsStringNumberOnly[i]: \(arr_IsStringNumberOnly[i]) \t '\(CharacterSet.init(arrayLiteral: "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ",", ".", "'" ).isSuperset(of: CharacterSet(charactersIn: arr_IsStringNumberOnly[i])) )'")

}

当前:

  • arr_IsStringNumberOnly [i]:123'true'
  • arr_IsStringNumberOnly [i]:456.7'true'
  • arr_IsStringNumberOnly [i]:890,1'true'
  • arr_IsStringNumberOnly [i]:1'234'true'
  • arr_IsStringNumberOnly [i]:'true'
  • arr_IsStringNumberOnly [i]:abc'false'
  • arr_IsStringNumberOnly [i]:def3'false'
  • arr_IsStringNumberOnly [i]:xyz 4'false'
  • arr_IsStringNumberOnly [i]:5äö'false'

答案 11 :(得分:-1)

试试这个:

if ( [resultTitles[indexPath.row] isMatchedByRegex:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"] ) {
  //Text is only numeric
}
else
{
  //Text is not only numeric
}