【问题标题】:How to check is a string or number如何检查是字符串还是数字
【发布时间】:2014-12-20 03:05:54
【问题描述】:

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

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

如何检查?

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

【问题讨论】:

    标签: swift


    【解决方案1】:

    这是一个使用字符串扩展的小型 Swift 版本:

    斯威夫特 3/斯威夫特 4:

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

    斯威夫特 2:

       extension String  {
            var isNumber : Bool {
                get{
                    return !self.isEmpty && self.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) == nil
                }
            }
       }
    

    【讨论】:

    • 对于 Swift 3:self.rangeOfCharacter(from: NSCharacterSet.decimalDigits.inverted) == nil
    • 添加 .invertedSet 而不是将返回值更改为 != nil 有什么意义?是更好的运行时还是什么?
    • 这没有为我处理负数。但是 'return Double(self) != nil' 做到了。
    【解决方案2】:

    编辑 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 进行计算。

    来自文档:

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

    【讨论】:

    • 请注意,这仅适用于 2^31 - 1(32 位拱的有符号整数限制)。我在一个与电话号码相关的项目中看到了这一点,电话号码很容易超过这个限制。
    • 此代码在 Swift 2.2 中导致编译错误。 “toInt() 不再可用:使用 Int() 初始化程序”
    • @Can 好点,这也让我绊倒了。我添加了一个可以处理任意大小数字的答案,包括 10 位或 11 位数字电话号码。
    • 这有点好笑;我仍然认为电话号码是字母字符。 不久前,像 215-LU6-5858 这样的东西是表示电话号码的一种完全有效的方式。 :) 我仍然主要将它们视为数据库中的字母数字,但是我正在重新训练自己以使用电话号码解析器和拨号程序代码来改变它。当我看到仅限美国的程序员将邮政编码放在数字字段中时,我确实会继续傻笑。 #wisdomofage ;)
    【解决方案3】:

    请注意,使用 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
        }
    
    }
    

    【讨论】:

    • 如果字符串为空,它仍然会返回 true。 po "".rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) nil
    • @CryingHippo 尝试添加!number.isEmpty 支票
    • 添加.invertedSet而不是将返回更改为!= nil有什么意义?是更好的运行时还是什么?
    • @TommyK 如果您检查非反转集,那么您会查看 String 是否包含数字,但您不知道它是否只是数字。
    • 现在是 Swift 4.2 中的 if !text_of_just_numbers.isEmpty && text_of_just_numbers.isEmpty.rangeOfCharacter(from: NSCharacterSet.decimalDigits.inverted) == nil { //is numeric }
    【解决方案4】:

    从 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.")
      }
    }
    

    【讨论】:

    • 这对于大于 4294967295 的号码是不准确的(例如,面积 > 429 的十位电话号码)
    【解决方案5】:

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

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

    【讨论】:

    • 干净,太棒了!
    • 验证 double 或 int。不错!
    【解决方案6】:

    斯威夫特 3、4

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

    【讨论】:

      【解决方案7】:

      这样的简单解决方案:

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

      【讨论】:

        【解决方案8】:

        我认为使用NumberFormatter 是一种简单的方法: (斯威夫特 5

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

        【讨论】:

          【解决方案9】:

          正确的方法是使用StringtoInt()方法,以及一个可选的绑定来判断转换是否成功。所以你的循环看起来像:

          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;如果转换成功。

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

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

          【讨论】:

            【解决方案10】:

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

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

            所以你会得到这样的东西:

            【讨论】:

              【解决方案11】:

              Swift 3.0 版本

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

              【讨论】:

                【解决方案12】:

                如果您想接受更细粒度的方法(即接受像 4.53e10 这样的数字),您可以这样进行:

                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
                }
                

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

                【讨论】:

                • 对于...........e.e.e.e.e 等字符串,这将错误地返回true。
                【解决方案13】:

                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
                        }
                

                【讨论】:

                  【解决方案14】:

                  此代码适用于 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 
                    }
                  

                  【讨论】:

                    【解决方案15】:

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

                    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 位拱形的有符号整数限制)。但是,对于较大的值,您仍然会得到字符串表示形式。

                    【讨论】:

                      【解决方案16】:

                      从 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();
                              }
                          }
                      
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 2013-10-09
                        • 1970-01-01
                        • 2012-12-23
                        • 2011-06-26
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2022-09-25
                        • 2022-01-10
                        相关资源
                        最近更新 更多