确定字符串是否为NSScanner的数字

时间:2011-09-08 14:04:28

标签: objective-c string numbers nsscanner

我试图找出我的字符串是否包含任何floatValue,并且如果是这种情况则重新签名第一个响应者,如果不是,则文本字段键盘应保留在屏幕上。

这段代码总是隐藏键盘,即使它不是floatValue:你知道如何让它工作吗?

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    NSScanner *scan = [NSScanner scannerWithString:[textField text]];
    if ([scan scanFloat:NULL]){

        [password resignFirstResponder];
        [passwordLength resignFirstResponder];
        return YES;

    } else {
        return NO;
    }
}

此外,我还没有尝试过循环,但如果您有任何想法,这是一个开始:

BOOL doesStringContain(NSString* string, NSString* string2){
    for (int i=0; i<[string length]; i++) {
        NSString* chr = [string substringWithRange:NSMakeRange(i, 1)];
        for (int j=0; j<[string2 length]; j++){
            if([chr isEqualToString:j])
                return TRUE;
        }
    }
    return FALSE;
}

非常感谢

2 个答案:

答案 0 :(得分:3)

NSScanner会指望您的浮点数位于字符串的开头。所以为了打击我们使用setCharactersToBeStripped。

setCharactersToBeStripped将过滤掉字符串中的所有非数字非句点字符,以便您剩下要扫描的所有字符都是您要查找的数字。

NSScanner将匹配int值(不带。)以及它将等于int 123到123.00000。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {    
    NSScanner *scan = [NSScanner scannerWithString:[textField text]];
    [scan setCharactersToBeSkipped:[[NSCharacterSet characterSetWithCharactersInString:@"1234567890."] invertedSet]];
    float f;
    if ([scan scanFloat:&f]){
        NSLog(@"Scanned a float %f",f);
        [textField resignFirstResponder];
        return YES;

    } else {
        NSLog(@"Did not scan a float");
        return NO;
    }
}

如果您想检查是否存在非数字字符而不是数字字符,请尝试:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {    

    NSCharacterSet *withFloats = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];

    NSCharacterSet *withoutFloats = [NSCharacterSet decimalDigitCharacterSet];

    // Change withFloats <-> withoutFloats depending on your need
    NSString *newString = [[textField.text componentsSeparatedByCharactersInSet:withFloats] componentsJoinedByString:@""];

    NSLog(@"newString %@", newString);

    if ([newString isEqualToString:@""]){
        NSLog(@"Scanned a numeric");
        [textField resignFirstResponder];
        return YES;

    } else {
        NSLog(@"Did not scan a numeric");
        return NO;
    }
}

答案 1 :(得分:1)

您正在实施错误的委托方法。当用户点击返回键时调用textFieldShouldReturn:。 (当控制试图从场地“返回”时,如果你正在思考的话,那就不是了。)

您应该实施textFieldShouldEndEditing:。这是你可以(尝试)停止文本字段丢失第一响应者状态,并保持键盘向上的地方。只需检查您正在执行的文本,然后返回YES或NO(让系统更新第一响应者状态)。

如果您希望返回键在输入有效时关闭键盘,则应在此处调用endEditing:。像这样:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    return [textField endEditing:NO];
}

NO参数表示不强制它,基本上允许您的textFieldShouldEndEditing:代码先检查文本。 (如果可以,请务必致电endEditing:,而不是resignFirstResponder。)

请注意,由于各种原因,文本字段可能会被迫放弃第一响应者状态,因此即使您以这种方式验证输入,也要准备好在将其保存到磁盘或发送之前再次验证它通过网络或任何你想用它做的事情。