验证NSString的十六进制值

时间:2011-11-04 15:54:59

标签: cocoa nsstring

我正在开发一个自定义的NSFormatter。 我需要逐步验证用户输入...我想通过isPartialStringValid:检查字符串是否只包含允许的字符“0123456789ABCDEF”。 我该如何验证这种情况?是否有一种方法可以使用NSString函数来检查字符串是否只包含一些字符?

5 个答案:

答案 0 :(得分:17)

这种方法适合你吗?

    NSString *string = @"FF";

    NSCharacterSet *chars = [[NSCharacterSet 
        characterSetWithCharactersInString:@"0123456789ABCDEF"] invertedSet];

    BOOL isValid = (NSNotFound == [string rangeOfCharacterFromSet:chars].location);

答案 1 :(得分:3)

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

另一个选项是与NSRegularExpression匹配。

示例代码Swift 3:

 func isValidHexNumber() -> Bool {
    let chars = CharacterSet(charactersIn: "0123456789ABCDEF")

    guard uppercased().rangeOfCharacter(from: chars) != nil else {
       return false
    }
    return true
 }

答案 2 :(得分:3)

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

//wrapper to an observable that requires accept/cancel
ko.protectedObservable = function(initialValue) {
    //private variables
    var _actualValue = ko.observable(initialValue),
        _tempValue = initialValue;

    //computed observable that we will return
    var result = ko.computed({
        //always return the actual value
        read: function() {
           return _actualValue();
        },
        //stored in a temporary spot until commit
        write: function(newValue) {
             _tempValue = newValue;
        }
    }).extend({ notify: "always" });

    //if different, commit temp value
    result.commit = function() {
        if (_tempValue !== _actualValue()) {
             _actualValue(_tempValue);
        }
    };

    //force subscribers to take original
    result.reset = function() {
        _actualValue.valueHasMutated();
        _tempValue = _actualValue();   //reset temp value
    };

    return result;
};

答案 3 :(得分:3)

雨燕5

extension String {
    func isHexNumber() -> Bool {
        self.filter(\.isHexDigit).count == count
    }
}

print("text1".isHexNumber()) // false
print("aa32".isHexNumber()) // true
print("AD1".isHexNumber()) // true

答案 4 :(得分:0)

Swift one-liner,无需添加任何扩展:

myString.allSatisfy(\.isHexDigit)

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

myString.allSatisfy({ $0.isHexDigit })