美文网首页
iOS限制输入框输入多个标点符号以及小数点保留后两位

iOS限制输入框输入多个标点符号以及小数点保留后两位

作者: 倒着游的鱼 | 来源:发表于2021-07-13 10:27 被阅读0次
#pragma mark - UITextField Delegate 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // 判断是否已经存在小数点
    if ([string isEqualToString:@"."] && [textField.text stringByReplacingOccurrencesOfString:@" " withString:@""].length == 0) {
        textField.text = @"";
        return NO;
    } else if ([string isEqualToString:@"."] && [textField.text containsString:@"."]) {
        return NO;
    }
 
    NSMutableString * futureString = [NSMutableString stringWithString:textField.text];
    [futureString  insertString:string atIndex:range.location];
    NSInteger flag=0;
    const NSInteger limited = 2;  // 小数点  限制输入两位
    for (NSInteger i = futureString.length-1; i>=0; i--) {
        if ([futureString characterAtIndex:i] == '.') {
            if (flag > limited)   return NO;
            break;
        }
        flag++;
    }
    return YES;
}

使用category 方式处理 限制输入框输入标点符号后保留后两位

给输入添加监听付费
 [self.priceField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];


--------调用以下 UITextField 中添加的类别方法 
/**
 *
 *  输入框限制输入处理保留两位小数点方法
 */
- (void)moneyTFDidTextChanged:(NSInteger)numEnob{
    
    if([self.text hasPrefix:@"0"] && self.text.length == 2){//如果用户第一输入了0,那么就不能让用户继续输入0~9的数字了
        NSString *subString = [self.text substringFromIndex:1];
        if (([subString integerValue] >0 && [subString integerValue] <= 9) || [subString isEqualToString:@"0"]) {
            self.text = [self.text substringToIndex:1];
        }
    }else if (self.text.length > numEnob && ![self.text containsString:@"."]){  //如果输入不为'.',则限制输入6位数
        self.text = [self.text substringToIndex:numEnob];
    }
    
    if ([self.text containsString:@"."]) {//如果输入的文本中含有小数点,则进入该方法
        NSRange range = [self.text rangeOfString:@"."];
        
        if (range.location == 0) {//如果小数点位置是第一位,则默认为0.
            self.text = @"0.";
        }else{//说明小数点的位置不是第一位
            if (self.text.length > 2) {
                NSString *subString = [self.text substringFromIndex:range.location + 1];//取出小数点后面的字符串
                subString = [subString stringByReplacingOccurrencesOfString:@"." withString:@""]; //将用户多输入的'.'去除
                if (subString.length > 2) {//小数点后面保留2位
                    subString = [subString substringToIndex:2];
                }
                if ([self.text hasPrefix:@"0."]) {
                    self.text = [NSString stringWithFormat:@"0.%@",subString];
                }else{
                    NSString *subString1 = [self.text substringToIndex:range.location];
                    self.text = [NSString stringWithFormat:@"%@.%@",subString1,subString];//拼接新的字符串
                }
            }
        }
    }
}

输入框只能输入数字和小数点后保留几位的方法


//输入框中只能输入数字和小数点,且小数点只能输入一位,参数number 可以设置小数的位数,该函数在-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string调用;

-(BOOL)isValidAboutInputText:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string decimalNumber:(NSInteger)number{
    
    NSScanner      *scanner    = [NSScanner scannerWithString:string];
    NSCharacterSet *numbers;
    NSRange         pointRange = [textField.text rangeOfString:@"."];
    if ( (pointRange.length > 0) && (pointRange.location < range.location  || pointRange.location > range.location + range.length) ){
        numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
    }else{
        numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
    }
    if ( [textField.text isEqualToString:@""] && [string isEqualToString:@"."] ){
        return NO;
    }
    short remain = number; //保留 number位小数
    NSString *tempStr = [textField.text stringByAppendingString:string];
    NSUInteger strlen = [tempStr length];
    if(pointRange.length > 0 && pointRange.location > 0){ //判断输入框内是否含有“.”。
        if([string isEqualToString:@"."]){ //当输入框内已经含有“.”时,如果再输入“.”则被视为无效。
            return NO;
        }
        if(strlen > 0 && (strlen - pointRange.location) > remain+1){ //当输入框内已经含有“.”,当字符串长度减去小数点前面的字符串长度大于需要要保留的小数点位数,则视当次输入无效。
            return NO;
        }
    }
    NSRange zeroRange = [textField.text rangeOfString:@"0"];
    if(zeroRange.length == 1 && zeroRange.location == 0){ //判断输入框第一个字符是否为“0”
        if(![string isEqualToString:@"0"] && ![string isEqualToString:@"."] && [textField.text length] == 1){ //当输入框只有一个字符并且字符为“0”时,再输入不为“0”或者“.”的字符时,则将此输入替换输入框的这唯一字符。
            textField.text = string;
            return NO;
        }else{
            if(pointRange.length == 0 && pointRange.location > 0){ //当输入框第一个字符为“0”时,并且没有“.”字符时,如果当此输入的字符为“0”,则视当此输入无效。
                if([string isEqualToString:@"0"]){
                    return NO;
                }
            }
        }
    }
    NSString *buffer;
    if ( ![scanner scanCharactersFromSet:numbers intoString:&buffer] && ([string length] != 0) ){
        return NO;
    }else{
        return YES;
    }
}

相关文章

网友评论

      本文标题:iOS限制输入框输入多个标点符号以及小数点保留后两位

      本文链接:https://www.haomeiwen.com/subject/ebbjpltx.html