1

I have an instance of UITextField. I has keyboard type as number pad, so that user can enter only decimal value. But I'm able to enter value as 2.4.5.5. Please tell how can restrict user to enter value only like 2.4

Amin Negm-Awad
  • 16,582
  • 3
  • 35
  • 50
iOSGuy
  • 171
  • 1
  • 14

3 Answers3

3

Try this:

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

    if ([textField.text containsString:@"."] && [string containsString:@"."]) {
        return NO;
    } else {
        return YES;
    }
}
Luan Lai
  • 473
  • 2
  • 10
0

I created sample project and I tried.I got exact solution.Check my answer below.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *charSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
    if ([string rangeOfCharacterFromSet:charSet].location != NSNotFound)
        return NO;
    else {
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        NSArray *arrSep = [newString componentsSeparatedByString:@"."];
        if([arrSep count] > 2)
            return NO;
        else {
            if([arrSep count] == 1) {
                if([[arrSep objectAtIndex:0] length] > 9)
                    return NO;
                else
                    return YES;
            }
            if([arrSep count] == 2) {
                if([[arrSep objectAtIndex:0] length] > 9)
                    return NO;
                else if([[arrSep objectAtIndex:1] length] > 2)  //Set after dot(.) how many digits you want.I set after dot I want 2 digits.If it goes more than 2 return NO
                    return NO;
                else {
                    if([[arrSep objectAtIndex:0] length] >= 10) //Again I set the condition here.
                        return NO;
                    else
                        return YES;
                }
            }
            return YES;
        }
    }
    return YES;
}

Output

First I enter 9 digits with dot according to condition.

enter image description here

Then I enter your input 2.4.After 2.4 if I try to give another dot it does not allow.

enter image description here

user3182143
  • 9,459
  • 3
  • 32
  • 39
0

Use this (It worked for me):

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


        NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
        NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:string];
        BOOL isNumbersOnly = ([numbersOnly isSupersetOfSet:characterSetFromTextField]);
        if (!isNumbersOnly) {
            return NO;
        }
        if ([string rangeOfString:@"."].location !=NSNotFound && [textField.text rangeOfString:string].location !=NSNotFound) {
            return NO;
        }

        return YES;
    }
Sargis
  • 1,196
  • 1
  • 18
  • 31