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
Asked
Active
Viewed 1,588 times
1

Amin Negm-Awad
- 16,582
- 3
- 35
- 50

iOSGuy
- 171
- 1
- 14
3 Answers
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
-
That implies no dot should be allowed – Jeff Bootsholz Nov 23 '17 at 02:30
-
We're still doing Objective C in 2017?? Swift 4 is out already, no? – Brad Caldwell Dec 01 '17 at 03:03
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.
Then I enter your input 2.4.After 2.4 if I try to give another dot it does not allow.

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