UITextField 对输入金额的约束
[2016/1/18更新] -- 五个人辛辛苦苦干了一年的项目终于上线了,今天有空看了一下正则表达式教程,然后开始rebuild之前的种种对字符串的约束,首先就从这个金额输入框开始吧,修改后的代码如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSString * pureString = textField.text;
NSString * laterString = [NSString stringWithFormat:@"%@%@",pureString,string];
if ([pureString isEqualToString:@""] && [@"0." containsString:string]) {
textField.text = @"0.";
return NO;
}else{
if ([pureString containsString:@"."]) {
NSString *regex = @"[0-9]{0,3}.[0-9]{0,2}"; //所限制的数字在0.00到999.99之间
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if ([test evaluateWithObject:laterString]) {
return YES;
}
return NO;
}else{
if ([string isEqualToString:@"."]) {
return YES;
}
NSString *regex = @"[0-9]{0,3}";
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
if ([test evaluateWithObject:laterString]) {
return YES;
}
return NO;
}
}
return NO;
}
这是第一次写正则表达式,节省了半数的代码量,用时大概五分钟(主要是有了上次的经验之后思路更加清晰了),感觉这次使用正则表达式的最大好处就是约束方便,原来用好多行if-else才能做出的判断,现在五行代码即可实现,是不是很方便?
这儿有个网站可供像我这样的正则菜鸟学习正则表达式,好东西就要和大家一起分享,仅此。
[2016/1/13更新] -- 对于输入限制这些东西,最好的方法还是使用正则表达式,不仅代码简洁优雅,而且可以免去很多意想不到的结果。最近刚开始重视正则表达式的用法,还不太懂,日后更新。
[2015/7/27] -- 输入金额的文本框是一个逻辑比较复杂的问题,要考虑的条件也比较的多。我考虑的主要有以下几点:
1、输入数字保留至小数点后两位
2、只能输入一个小数点(因为之前看到别人博客的代码遗漏了这一点)
3、如果用户第一个输入的是小数点,则自动为其填充 ‘.’ 前的 ‘0’
下面是代码,引用时需要设置一个纪录小数点个数的全局变量,如下:
@property (nonatomic,assign)NSInteger numberOfPoint; //小数点个数
主体代码如下:
/**
* 限制输入两位小数
* 输入小数点后两位之后,再输入其他字符回收键盘
*/
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSMutableString * currentString = [NSMutableString stringWithString:textField.text];
NSMutableString * futureString = [NSMutableString stringWithFormat:@"%@%@",currentString,string]; //禁止输入除数字和‘.’之外的其他字符
if (![@"1234567890." containsString:string] && ![string isEqualToString:@""]) {
return NO;
} NSInteger flag=;
const NSInteger limited = ;
if (![textField.text containsString:@"."]){
_numberOfPoint = ;
}else if( == _numberOfPoint){
_numberOfPoint = ;
} //1、如果text field中没有字符,且输入的字符位 ‘.’,则自动填充 ‘0’
if (textField.text.length < && [string isEqualToString:@"."]) {
textField.text = @"";
_numberOfPoint ++;
return YES;
}else if( == textField.text.length && [string isEqualToString:@""]) {
textField.text = @"0.";
_numberOfPoint ++;
return NO;
}else {
//只能有一个小数点
if (_numberOfPoint > && [string isEqualToString:@"."]) {
return NO;
}
if (_numberOfPoint == && [string isEqualToString:@"."]) {
_numberOfPoint ++;
} if (range.location >= futureString.length - ) {
//从后往前遍历字符串flag用于记录小数点后的数字位数
for (int i = (int)futureString.length- ; i>=; i--) {
if ([futureString characterAtIndex:i] == '.') {
if (flag > limited) {
//回收键盘
[textField resignFirstResponder];
return NO;
}
break;
}
flag++;
}
}
}
return YES;
}
上面这些考虑完之后,还可以有下面这些考虑:
1、禁用输入框的选择、复制、粘贴等功能
要实现上面的这个考虑需要写一个继承于UITextField的类,重写canPerformAction: withSender:方法就可以了,尤其他需要的话可以根据规律进行设置。
主体代码如下:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
if (action == @selector(paste:) || //粘贴
action == @selector(select:) || //选择
action == @selector(selectAll:)) //全选
{
return NO;
}
return [super canPerformAction:action withSender:sender];
}
如果有些地方不合理,欢迎提出意见!
UITextField 对输入金额的约束的更多相关文章
- UITextField 的限制输入金额(可为小数的正确金额)
要判断输入金额为正确金额的方法有两个,一个是用正则表达式,另一个就是用textfield的代理方法 有时候难免遇到这样的需求,不符合规则的金额就不让输入时,那用这种方法比较合理 如果设置输入键盘为De ...
- iOS textField输入金额的限制,小数点前9位,后面两位
iOS textField输入金额的限制,小数点前9位,后面两位,如果不加小数点,最大位数是9位,加上小数点,最大位数是12位,超出最大位数可删除 - (BOOL)textField:(UITextF ...
- jquery限制文本框只能输入金额
$("#batch_diff_percent").keyup(function () { var reg = $(this).val().match(/\d+\.?\d{0,2}/ ...
- iOS UITextField限制输入数字
有时候项目中要求文本框中只能输入数字,如:价格.公里数.费用等等,一般的文本框不限制输入的格式,这时候只能强制限制输入框的输入格式了,代码如下: #import "ViewControlle ...
- input框输入金额显示千分位
比如输入:1000000,则显示为1,000,000(或者是保留3位小数:1,000,000.000) 知识点: 1)JavaScript parseFloat() 函数: 定义:parseFloat ...
- 更好地限制一个UITextField的输入长度
要限制一个UITextField的输入字数,首先想到的应该是通过 UITextFieldDelegate 的代理方法来限制: - (BOOL)textField:(UITextField *)text ...
- 再谈EditText只能输入金额
上次写了一篇EditText只能输入金额的博客,后来发现一个bug,当还未输入数字的情况下输入小数点程序就崩了,我去测了一下支付宝,看看会怎么样,我先输入小数点,程序正常,我再输入数字,可以正常输入, ...
- 微信支付v3开发(5) 扫码并输入金额支付
关键字:微信支付 微信支付v3 动态native支付 统一支付 Native支付 prepay_id 作者:方倍工作室 本文介绍微信支付下的扫描二维码并输入自定义金额的支付的开发过程. 注意 微信支付 ...
- UITextField 输入金额,小数点的控制输入
#pragma mark --- UITextFieldDelegate ---- (BOOL)textField:(UITextField *)textField shouldChangeChara ...
随机推荐
- HTTP 错误 404.3 - Forbidden
在iis中能够浏览所有扩展名的文件时,IIS MIME的 映射 您只能在故障排除过程中将通配符映射添加到 IIS MIME 映射中,以作为一种临时解决方案.确定缺少 MIME 类型是问题的原因后,请删 ...
- android获取package name
下载apk resigner(此被,,) 另外一个下载url 配置好android 环境,ANDROID_HOME 和路径直接到sdk,将.apk拖到此apk resigner,将会得出package ...
- Cubieboard编译安装NodeJS经验总结
Cubieboard编译安装NodeJS经验总结,以供新手免走弯路. Cubieboad用的是arm处理器,NodeJs的编译安装上不像pc上那么简单,可以一遍过. 单单make编译一次,就得几乎一个 ...
- Maven3.0.3的环境变量配置
Maven3.0.3的环境变量配置 //该配置经过实际验证已经可以使用.验证的环境maven3.0.3(官网的目前最新版)1 windows maven3的安装 标签: #maven | 发布时间: ...
- Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback开发实例
原文:Android图形系统之Surface.SurfaceView.SurfaceHolder及SurfaceHolder.Callback之间的联系 Surface是原始图像缓冲区(raw buf ...
- select * from table where 1=1让您茅塞顿开(转)
在很多网站上,都经常看到select * from table where 1=1这样的一种查询语句: 这是一种怎样的查询语句呢?首先说明,1=1不是查询语句中的任何关键词,所以,请您放心,不管你会不 ...
- 问题-[Delphi]SendMessageTimeout调用后卡住点击任务栏还会出现窗体处理
问题现象:在使用SendMessageTimeout函数后,5秒后WIN把进程挂在起.这时把程序最小化(原因就是不想让用户看到卡的界面),但点击任务栏按钮界面还原了,拦截消息失败(原因是挂起后消息都放 ...
- JAVA 调用Axis2 code generator 生成的webservice
以下代码为调用 JAVA 调用Axis2 code generator 生成的webservice的代码. package test; import java.rmi.RemoteException; ...
- Nginx平台构架 分类: Nginx 2015-07-13 10:55 205人阅读 评论(0) 收藏
深入理解Nginx模块发开与架构解析读书笔记. nginx在启动后,在unix系统中会以daemon的方式(可以手动关闭 nginx.conf daemon off)在后台运行,后台进程包含一个mas ...
- 百度的android采访分析
今天早上10分,我接到一个电话采访百度.当然,我说提前.我的病是多么强烈延迟.所以我也没怎么准备,当然,我也看他们的真实水平的思考.在这次审查中! ! ! ! ! !! .! ! ! !.!! !.! ...