在我的应用程序中,我只想允许用户输入“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”这样的功能。但是它不允许因为如果
它会转到其他部分答案 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;
}