美文网首页
iOS两位小数终极判断

iOS两位小数终极判断

作者: 懂哲学的老鼠 | 来源:发表于2019-09-30 18:02 被阅读0次
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
        if (string.length == 0) {
            return YES;
        }
    
        BOOL isHaveDian   = NO;
        BOOL willHaveDian = NO;
    
        // 判断是否有小数点
        if ([textField.text containsString:@"."]) {
            isHaveDian = YES;
        } else {
            isHaveDian = NO;
        }
        
        if ([string containsString:@"."]) {
            willHaveDian = YES;
        } else {
            willHaveDian = NO;
        }
        
        if (string.length > 0) {
            
            if (string.length > 1) {
                NSString *regex = @"^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?$"; // 小数
                NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
                BOOL isCode = [pred evaluateWithObject:string];
                if (!isCode) {
                    MYLog(@"正则-您输入的格式不正确");
                    return NO;
                }
            }
        
            // 当前输入的字符
            unichar single = [string characterAtIndex:0];
            
            // 不能输入.0~9以外的字符
            if (!((single >= '0' && single <= '9') || single == '.')){
                MYLog(@"您输入的格式不正确");
                return NO;
            }
            
            // 只能有一个小数点
            if (isHaveDian && single == '.') {
                MYLog(@"只能输入一个小数点");
                return NO;
            }
            
            if (isHaveDian && willHaveDian) {
                MYLog(@"只能输入一个小数点");
                return NO;
            }
            
            // 如果第一位是.则前面加上0
            if ((textField.text.length == 0) && (single == '.')) {
                textField.text = @"0";
            }
            
            // 如果第一位是0则后面必须输入.
            if ([textField.text hasPrefix:@"0"]) {
                if (textField.text.length > 1) {
                    NSString *secondStr = [textField.text substringWithRange:NSMakeRange(1, 1)];
                    if (![secondStr isEqualToString:@"."]) {
                        NSLog(@"第二个字符必须是小数点");
                        return NO;
                    }
                } else {
                    if (![string isEqualToString:@"."]) {
                        NSLog(@"第二个字符必须是小数点");
                        return NO;
                    }
                }
            }
            
            NSInteger pointNum = 2;
            
            // 小数点后最多能输入两位
            if (isHaveDian || willHaveDian) {
                NSString *tobeString = [textField.text stringByReplacingCharactersInRange:range withString:string];
                NSRange ran = [tobeString rangeOfString:@"."];
                if ((tobeString.length - ran.location - 1) > pointNum) {
                    
                    NSRange r = NSMakeRange(ran.location + 1, tobeString.length - ran.location - 1);
                    
                    NSString *frontString  = [tobeString substringToIndex:r.location];
                    NSString *behindString = [[tobeString substringWithRange:r] substringToIndex:pointNum];
                    
                    NSString *fianlString = [NSString stringWithFormat:@"%@%@",frontString,behindString];
                
                    textField.text = fianlString;
                    NSLog(@"只能输入二两位小数");
                    return NO;
                }
            }
        }
    
        return YES;
    }

    相关文章

      网友评论

          本文标题:iOS两位小数终极判断

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