码迷,mamicode.com
首页 > 移动开发 > 详细

【ios学习记录】- UITextField输入浮点数的限制

时间:2016-05-12 14:10:52      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

通常在编辑框中输入一些货品数量,金额时,我们都会做一些输入的判断限制。例如不能输入非法字符,只能输入数字等等。现把最近遇到的一些输入限制需求展现如下:

1、 输入小数位不能超过两位;
2、 不能重复输入小数点;
3、 不能输入除数字以外的字符(但不包括退格键,负号键);
4、 限制长度为最小为1,最大为11。

为了实现以上需求,主要是依靠以下UITextFieldDelegate的一个协议方法来实现的:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
功能:
  把textField中位置为range的字符串替换为string字符串;
  此函数在textField内容被修改时调用;
返回值:
  YES,表示修改生效;NO,表示不做修改,textField的内容不变。
参数说明:
  textField:响应UITextFieldDelegate协议的UITextField控件。
  range:    UITextField控件中光标选中的字符串,即被替换的字符串;
          range.length为0时,表示在位置range.location插入string。
  string:    替换字符串;
  string.length为0时,表示点击了删除delete键。

以下所有的代码需要写在该函数中。

1、 输入小数位不能超过两位

/**
 *  检查浮点数小数位并校验小数点合法性
 *
 *  @param range     浮点数总长度
 *  @param dotPlaces 小数位
 *  @param decimal   浮点数
 *  @param string    当前输入的数值
 *
 *  @return YES:没有小数点或者限制两位浮点数
 NO
 */
+ (BOOL)checkDecimalDotPlaces:(NSRange)range dotPlaces:(NSNumber *)dotPlaces decimal:(NSString *)decimal{
    BOOL bHaveDot = false;

    if (dotPlaces.integerValue < 0) {
        dotPlaces = @0;
    }

    if ([decimal rangeOfString:@"."].location == NSNotFound){
        bHaveDot = false;
    }else{
        bHaveDot = true;
    }

    if (bHaveDot) {
        //判断小数点的位数
        NSRange ran = [decimal rangeOfString:@"."];
        if (range.location - ran.location > dotPlaces.integerValue) {
            return NO;
        }
    }

    return YES;
}

2、 不能重复输入小数点

//不能再输入小数点
if ([string rangeOfString:@"."].location != NSNotFound && [textField.text rangeOfString:@"."].location == NSNotFound) {
return NO;
}

3、 不能输入除数字以外的字符(但不包括退格键,负号键)

//不能输入字符串
if ([string rangeOfString:@"."].location == NSNotFound)              {
   NSRange range = [string rangeOfString:@"^[0-9-]+$" options:NSRegularExpressionSearch];
   if (range.location == NSNotFound) {
       return NO;
   }
}

//删除delete键
if ([string isEqualToString:@""]) {
   return YES;
}

4、 限制长度为最小为1,最大为11位

NSString *pwdRegex = @"[0-9]{1,10}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",pwdRegex];

if ([predicate evaluateWithObject:textField.text] || ![textField.text notEmpty]) {
    return YES;
}else{
    return NO;
}

另外,对于字符串的判断可以选择在NSString的分类扩展里进行设置,如NSString+Extension。

总代码如下:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    //不能再输入小数点
    if ([string rangeOfString:@"."].location != NSNotFound && [NSString isHaveDot:textField.text]) {
        return NO;
    }

    //delete
    if ([string isEqualToString:@""]) {
        return YES;
    }

    //不能输入字符串
    if ([string rangeOfString:@"."].location == NSNotFound) {
        NSRange range = [string rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch];
        if (range.location == NSNotFound) {
            return NO;
        }
     }

    //限制长度为最小为1,最大为11位
    NSString *pwdRegex = @"[0-9]{1,10}";

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",pwdRegex];

    if ([predicate evaluateWithObject:textField.text] || ![textField.text notEmpty])                     {
    return YES;
    }else{
        return NO;
    }

    //限制小数位长度不超过2
    if (![NSString checkDecimalDotPlaces:range dotPlaces:ZHJFloatDotPlaces decimal:textField.text]) {
        return NO;
    }

    return YES;
}

【ios学习记录】- UITextField输入浮点数的限制

标签:

原文地址:http://blog.csdn.net/oceanlucy/article/details/51361130

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!