Nomeqc
12/20/2018 - 7:25 AM

限制文本框只能输入数字和小数点.md

  • 总长度不超过10
  • 小数点后不超过2位
  • 只能输入数字或小数点
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (string.length == 0) {
        return YES;
    }
    ///格式化
    dispatch_block_t formatTextFieldText = ^{
        NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:textField.text];
        if (!isnan(decimalNumber.doubleValue)) {
            textField.text = decimalNumber.stringValue;
        }
    };
    
    NSString *generatedString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    
    ///长度不超过10
    if (generatedString.length > 10) {
        return NO;
    }
    ///小数点的个数
    NSUInteger numberOfDots = generatedString.length - [[generatedString componentsSeparatedByString:@"."] componentsJoinedByString:@""].length;
    ///不能超过1个小数点
    if (numberOfDots > 1) {
        formatTextFieldText();
        return NO;
    }
    ///小数点后只能有两位
    if (numberOfDots == 1 && [generatedString componentsSeparatedByString:@"."].lastObject.length > 2) {
        formatTextFieldText();
        return NO;
    }
    
    ///只能输入数字或小数点
    NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."].invertedSet;
    if (![string isEqualToString:[[string componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""]]) {
        formatTextFieldText();
        return NO;
    }
    return YES;
}