如何检查字符串或数字

时间:2014-10-24 09:27:26

标签: swift

我有一个数组["abc", "94761178","790"]

我想迭代每个并检查是字符串还是整数?

如何检查?

如何将“123”转换为整数123

16 个答案:

答案 0 :(得分:46)

编辑Swift 2.2:

在swift 2.2中使用Int(yourArray[1])

var yourArray = ["abc", "94761178","790"]
var num = Int(yourArray[1])
if num != nil {
 println("Valid Integer")
}
else {
 println("Not Valid Integer")
}

它会显示字符串是有效整数,num包含有效Int。您可以使用num进行计算。

来自docs:

  

如果字符串表示适合Int的整数,则返回   相应的整数。这接受与常规字符串匹配的字符串   表达" [ - +]?[0-9] +"仅

答案 1 :(得分:44)

这是一个使用String扩展名的小型Swift版本:

Swift 3 / Swift 4:

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

斯威夫特2:

extension String  {
    var isNumber: Bool {
        return !isEmpty && rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
    }
}

答案 2 :(得分:40)

请注意,使用Int初始化程序检查字符串/数字有限制。具体来说,最大值为2 ^ 32-1或4294967295.这可能会导致问题,因为电话号码8005551234将无法Int(8005551234)检查,尽管它是有效号码。

更安全的方法是使用NSCharacterSet检查与字符串范围内的小数集匹配的任何字符。

let number = "8005551234"
let numberCharacters = NSCharacterSet.decimalDigitCharacterSet().invertedSet
if !number.isEmpty && number.rangeOfCharacterFromSet(numberCharacters) == nil {
    // string is a valid number
} else {
    // string contained non-digit characters
}

此外,将其添加到String扩展名可能很有用。

public extension String {

    func isNumber() -> Bool {
        let numberCharacters = NSCharacterSet.decimalDigitCharacterSet().invertedSet
        return !self.isEmpty && self.rangeOfCharacterFromSet(numberCharacters) == nil
    }

}

答案 3 :(得分:19)

从Swift 2开始,删除了String.toInt()。 正在引入一个新的Int Initializer:Int(str:String)

for target in ["abc", "94761178","790"]
{
  if let number = Int(target)
  {
     print("value: \(target) is a valid number. add one to get :\(number+1)!")
  }
  else
  {
    print("value: \(target) is not a valid  number.")
  }
}

答案 4 :(得分:9)

我认为最好的解决方案是:

extension String {
    var isNumeric : Bool {
        return Double(self) != nil
    }
}

答案 5 :(得分:6)

斯威夫特3,4,

extension String {
    var isNumber: Bool {
        let characters = CharacterSet.decimalDigits.inverted
        return !self.isEmpty && rangeOfCharacter(from: characters) == nil
    }
}

答案 6 :(得分:4)

正确的方法是使用toInt()的{​​{1}}方法和可选的绑定来确定转换是否成功。所以你的循环看起来像:

String

let myArray = ["abc", "94761178","790"] for val in myArray { if let intValue = val.toInt() { // It's an int println(intValue) } else { // It's not an int println(val) } } 方法返回toInt(),因此可选Int?,如果字符串无法转换为整数,则为Int,或nil如果转换成功,则返回值(包含在可选项中)。

方法文档(使用CMD +在Xcode中点击Int显示)说:

  

如果字符串表示适合Int的整数,则返回相应的整数。这接受的字符串只匹配正则表达式“[ - +]?[0-9] +”。

答案 7 :(得分:3)

这种方式也适用于带有混合数字的字符串:

public extension String {
func isNumber() -> Bool {
    return !self.isEmpty && self.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil && self.rangeOfCharacter(from: CharacterSet.letters) == nil
}}

所以你得到这样的东西: enter image description here

答案 8 :(得分:3)

像这样的简单解决方案:

extension String {
    public var isNumber: Bool {
        return !isEmpty && rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
    }
}

答案 9 :(得分:1)

Swift 3.0版

func isNumber(stringToTest : String) -> Bool {
    let numberCharacters = CharacterSet.decimalDigits.inverted
    return !s.isEmpty && s.rangeOfCharacter(from:numberCharacters) == nil
}

答案 10 :(得分:0)

如果您想接受更细粒度的方法(即接受 4.5 3e10 等数字),请按以下步骤操作:

func isNumber(val: String) -> Bool
{
   var result: Bool = false
   let parseDotComNumberCharacterSet = NSMutableCharacterSet.decimalDigitCharacterSet()
   parseDotComNumberCharacterSet.formUnionWithCharacterSet(NSCharacterSet(charactersInString: ".e"))

            let noNumberCharacters = parseDotComNumberCharacterSet.invertedSet
            if let v = val
            {
                result = !v.isEmpty && v.rangeOfCharacterFromSet(noNumberCharacters) == nil
            }
   return result
}

为了获得更好的分辨率,您可以使用正则表达式。

答案 11 :(得分:0)

Xcode 8和Swift 3.0

我们也可以查看:

 //MARK: - NUMERIC DIGITS
        class func isString10Digits(ten_digits: String) -> Bool{

            if !ten_digits.isEmpty {

                let numberCharacters = NSCharacterSet.decimalDigits.inverted
                return !ten_digits.isEmpty && ten_digits.rangeOfCharacter(from: numberCharacters) == nil 
            }
            return false
        }

答案 12 :(得分:0)

此代码适用于Swift 3/4

  func isNumber(textField: UITextField) -> Bool {
    let allowedCharacters = CharacterSet.decimalDigits
    let characterSet = CharacterSet(charactersIn: textField.text!)
    return allowedCharacters.isSuperset(of: characterSet)
  //        return true 
  }

答案 13 :(得分:0)

我认为使用NumberFormatter是一种简单的方法: (迅速5

import Foundation

extension String {

    var isNumeric : Bool {
        return NumberFormatter().number(from: self) != nil
    }

}

答案 14 :(得分:0)

您可以将其用于任何长度的整数。

func getIntegerStrings(from givenStrings: [String]) -> [String]
{
    var integerStrings = [String]()
    for string in givenStrings
    {
        let isValidInteger = isInteger(givenString: string)
        if isValidInteger { integerStrings.append(string) }
    }
    return integerStrings
}

func isInteger(givenString: String) -> Bool
{
    var answer = true
    givenString.forEach { answer = ("0"..."9").contains($0) && answer }
    return answer
}

func getIntegers(from integerStrings: [String]) -> [Int]
{
    let integers = integerStrings.compactMap { Int($0) }
    return integers
}

let strings = ["abc", "94761178", "790", "18446744073709551615000000"]
let integerStrings = getIntegerStrings(from: strings)
let integers = getIntegers(from: integerStrings)

print(integerStrings) // ["94761178", "790", "18446744073709551615000000"]
print(integers) // [94761178, 790]

但是,正如@Can所指出的那样,您只能获得最大2 ^ 31-1(32位arch的有符号整数限制)的整数值。但是,对于较大的值,您仍将获得字符串表示形式。

答案 15 :(得分:-4)

从corsiKa发布的下面stackoverflow帖子中获取以下isInteger()函数: Determine if a String is an Integer in Java

我认为这就是你想要做的事情(nameOfArray是你要传递的数组)

void convertStrArrayToIntArray( int[] integerArray ) {

    for (int i = 0; i < nameOfArray.length(); i++) {
        if (!isInteger(nameOfArray[i])) {
            integerArray[i] = nameOfArray[i].toString();
        }
    }

}