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

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

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;
}
时间: 2024-07-30 14:41:41

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

ios学习记录 day41 UI17 多线程

CPU(工厂) 进程(车间) 线程(工人) 一个进程代表一个应用程序 CPU总是运行一个进程,其它进程处于非运行状态.一个进程可以包含多个线程.线程与线程之间可以共享进程的内存区域. 打开一个应用程序,系统会给我们创建一个线程,称为主线程 管理主界面的UI与内部循环机制(与界面相关的东西必须放在主线程中!!!) 压力比较大且会造成线程阻塞(界面卡),因此我们通过创建子线程来对主线程进行分压. 什么时候用多线程 1.网络请求(同步的) 2.文件读写(少) 3.大数据计算(冒泡) 4.数据库sele

ios学习记录 day42 UI18 集合视图

集合视图UICollectionView 简单来说就是多列的TableView 它们同样是datasource和delegate设计模式UICollectionViewLayout是一个对View布局和行为描述的类  UICollectionViewFlowLayout是它的子类 ios学习记录 day42 UI18 集合视图,码迷,mamicode.com

iOS学习记录之-AvAudioPlayer

前言:这两天老师布置了一个作业,编写一个音乐播放器的程序,使用AvAudioPlayer类. AvAudioPlayer类是编写iOS播放器的三个类之一,其他两个以后用到再阐述.今天的主角是AvAudioPlayer.下面我们来一起看看这个类 首先介绍一下,AvAudioPlayer它是苹果公司封装好的一个类,用起来很方便,功能也很强大,但是它只支持播放沙盒存好的音乐,不支持在线播放,是苹果公司自家ipod 播放器专用的.这点大家知道即可不必深究: 好,言归正传: 1,创建AvAudioPlay

ios学习记录 day44 UI20 Storyboard 高级可视化编程 + 单例

可视化编程 : 5.0之前 xib  5.0之后 Storyboard 注意事项:1.在AppDelegate中不用代码初始化一个window   2.在general  设置 Main Interface(创建的时候自动设置的) weak可以指向 但是没有拥有权   strong有拥有权 单例特性: 1.唯一性  创建的对象永远指向同一块内存地址     2.不释放   从打开程序到后台关闭 对象都不释放 单例安全:加锁@synchronized  防止同一块内存被创建两次,破坏唯一性 //单

IOS 学习笔记---UITextField的一些属性

UITextField* textField=[[UITextField alloc]initWithFrame:CGRectMake(60, 100, 200, 30)]; //属性 //样式 textField.borderStyle=UITextBorderStyleBezel;//矩形有阴影 textField.borderStyle=UITextBorderStyleLine;//矩形没有阴影 textField.borderStyle=UITextBorderStyleNone;//

IOS 学习记录

表情排列 // // MJViewController.m // 01-表情排列 // // Created by apple on 13-11-24. // Copyright (c) 2013年 itcast. All rights reserved. // #import "MJViewController.h" /* 1.adjust....方法去掉第2个参数----add:(BOOL)add (不能增加全局变量或者成员变量) 2.在表情最后面增加一个“+”按钮,添加按钮在尾部

【ios学习记录】-如何定制UITableView的圆角单元格

自从ios7更新以来,UITableView控件的边角style由默认圆角变成了直角,更加适应UI扁平化设计的效果了.但对于某种情况来说,如果tableview宽度不是拉伸到与父视图等宽,那么使用直角的tableview则会显得不好看.如下图分组列表(group tableview)所示. 而如果此时采用圆角效果的话,则会显示圆润温和,用户会觉得好看,体验很好.如下图所示. 要实现以上分组列表(group tableview)的圆角效果,主要是通过Core Graphics API来实现图层重绘

学习ios笔记第一天的C语言学习记录

c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 = num2; //先把temp放到num2里 num2 = temp; 算数运算符 +加法运算 -减法运算符 *乘法运算符 /除法运算符  ------整型相除取整,除数不为0 %取余运算符 ------两边均为整数 ++递增运算-------运算符在前,先执行:运算符在后,后执行: --递减运

iOS学习资源收集

https://github.com/Tim9Liu9/TimLiu-iOS 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.com/search 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 动画 侧滑与右滑返回手势 gif动画 其他动画 网络相关 网络连接 图像获取 网络