验证用户输入编号

时间:2014-02-14 12:34:51

标签: ios iphone validation nsnumberformatter

在我的应用程序中,我只想允许用户输入“1111.11”格式的十进制数。这意味着最多4位数的整数和最多2位十进制数我想在用户在文本框中编辑时检查这一点。如果用户输入错误的输入,则不应允许进入文本框。我已编写代码:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

方法,但虽然我没有得到理想的结果。这是我的代码

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == txtFund)
{
    double num;
        long iPart;
        double fPart;
            num = [textField.text doubleValue];
            iPart = (long) num;
            fPart = num - iPart;
        NSLog(@"1 %ld %f",iPart,fPart);
        NSString *integerPart=[NSString stringWithFormat:@"%ld",iPart];

            if([integerPart length]>=4){
                if([string isEqualToString:@"."]){

                }
                else{
                return NO;
                }
            }
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:nil];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
                                                        options:0
                                                          range:NSMakeRange(0, [newString length])];
    if (numberOfMatches == 0)
        return NO;
}

return YES;
 }

通过这段代码,我可以实现像“4444”这样的功能。但是它不允许因为如果

它会转到其他部分

3 个答案:

答案 0 :(得分:2)

此代码应该是您想要的。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSString *expression = @"^([0-9]{1,4})?(\\.([0-9]{1,2})?)?$";

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:nil];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
                                                        options:0
                                                          range:NSMakeRange(0, [newString length])];
    if (numberOfMatches == 0)
        return NO;

    return YES;
}

答案 1 :(得分:1)

您可以使用textfield textFieldShouldEndEditing方法

结帐
 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
 {
    // getting the textfield text 
    // Separating the textfield value by (.)
    NSArray *arr=[textField.text componentsSeparatedByString:@"."];
    // Checking the textfiled text before dot
    NSLog(@"arr lenth @0==%i",[[arr objectAtIndex:0] length]);
    // Checking the textfiled text after dot
    NSLog(@"arr lenth @1==%i",[[arr objectAtIndex:1] length]);

   if([[arr objectAtIndex:0] length]>4)
   {
    // Comes here if textfield text value before dot is greater then 4 digits
    }

     if([[arr objectAtIndex:1] length]>2)
   {
      // Comes here if textfield text value after dot is greater then 2 digits
    }
 }

答案 2 :(得分:1)

而不是用户键入。十进制符号,您可以以编程方式插入一个并允许用户继续。请尝试以下代码:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    //NSLog(@"%i", textField.text.length);

        NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
        for (int i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if (![myCharSet characterIsMember:c])
            {
                return NO;
            }
            if(textField.text.length == 4) // Place a '.' when the text length is 4
            {
              textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@"."];
            }
            if(textField.text.length >=7) // Restrict the user to enter only 7 digits incl. the dot
            {
                return NO;
            }
        }
        return YES;
}

更新:(如果您真的希望用户在点中使用tyPe,请尝试以下代码)

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    //NSLog(@"%i", textField.text.length);

        NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
        for (int i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if (![myCharSet characterIsMember:c])
            {
                return NO;
            }
            if(textField.text.length == 4 && (![string isEqualToString:@"."])) // Checks for the 5th character and if it is not '.', then not letting the user to type in..
            {

                return NO;
             // textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@"."];
            }
            if(textField.text.length >=7) // Restrict the user to enter only 7 digits incl. the dot
            {
                return NO;
            }
        }
        return YES;
}