【问题标题】:Validate NSString for Hexadecimal value验证 NSString 是否为十六进制值
【发布时间】:2011-11-04 15:54:59
【问题描述】:

我正在开发一个自定义 NSFormatter。 我需要逐步验证用户输入...我想通过isPartialStringValid: 检查字符串是否仅包含允许的字符“0123456789ABCDEF”。 我怎样才能验证这个条件?有没有办法用 NSString 函数来检查一个字符串是否只包含一些字符?

【问题讨论】:

    标签: cocoa nsstring


    【解决方案1】:

    这个方法对你有用吗?

        NSString *string = @"FF";
    
        NSCharacterSet *chars = [[NSCharacterSet 
            characterSetWithCharactersInString:@"0123456789ABCDEF"] invertedSet];
    
        BOOL isValid = (NSNotFound == [string rangeOfCharacterFromSet:chars].location);
    

    【讨论】:

      【解决方案2】:

      斯威夫特 5

      extension String {
          var isHexNumber: Bool {
              filter(\.isHexDigit).count == count
          }
      }
      
      print("text1".isHexNumber) // false
      print("aa32".isHexNumber) // true
      print("AD1".isHexNumber) // true
      

      【讨论】:

        【解决方案3】:

        您可以创建包含允许字符 (+ characterSetWithCharactersInString:) 的自定义 NSCharacterSet,然后使用 rangeOfCharacterFromSet: 测试字符串。如果返回的范围等于字符串的整个范围,则您有一个匹配项。

        另一个选项是匹配NSRegularExpression

        Swift 示例代码:

        func isValidHexNumber() -> Bool {
            guard isEmpty == false else { return false }
            let chars = CharacterSet(charactersIn: "0123456789ABCDEF").inverted
            return uppercased().rangeOfCharacter(from: chars) == nil
        }
        

        【讨论】:

          【解决方案4】:

          swift 2.1 中,您可以通过这种方式扩展 String:

          extension String {
          
            func isValidHexNumber() -> Bool {
              let chars = NSCharacterSet(charactersInString: "0123456789ABCDEF").invertedSet
              guard self.uppercaseString.rangeOfCharacterFromSet(chars) != nil else {
                  return false
              }
              return true
            }
          
          }
          

          【讨论】:

            【解决方案5】:

            Swift 单行,不添加任何扩展:

            myString.allSatisfy(\.isHexDigit)
            

            在 Swift 5.2 中引入了 keypath 谓词,在此之前您可以使用:

            myString.allSatisfy({ $0.isHexDigit })
            

            【讨论】:

              猜你喜欢
              • 2012-07-10
              • 2017-04-03
              • 2011-02-08
              • 2018-09-07
              • 2012-06-16
              • 2011-05-15
              • 2011-03-04
              • 1970-01-01
              相关资源
              最近更新 更多