textField 输入金额的限制

由于开发中用到金额输入,需要对 textField 输入框做限制,保证输入金额格式的合法性,现对限制规则做以下总结。

具体实现的限制

  1. 金额只能包含数字 0 ~ 9 和 小数点;
  2. 首位不能是小数点;
  3. 小数点只能存在一个;
  4. 首位为 0 时,第二位必须是小数点;
  5. 小数点后面最多两位。
  • 这里主要使用了 textField 的以下代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
  • 下面是具体代码,内含详细注释
// textField输入金额的限制
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
    //金额的最大长度,自行调节
    if (textField.text.length > 10) {
        return range.location < 11;
    }else{
        
        //记录是否有小数点
        BOOL isHaveDian = YES;
        if ([textField.text rangeOfString:@"."].location == NSNotFound) {
            isHaveDian=NO;
        }
        
        if ([string length] > 0) {
            unichar single = [string characterAtIndex:0];//当前输入的字符
            
            if ((single >= '0' && single <= '9') || single == '.') {//数据格式正确
                
                //首字母不能为小数点
                if([textField.text length] == 0){
                    if(single == '.'){
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        return NO;
                    }
                }
                
                //首位为0时,只能输入小数点
                if([textField.text length] == 1 && [textField.text isEqualToString:@"0"]){
                    if(single != '.'){
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        [RKDropdownAlert title:@"提示" message:@"首位为0时,只能输入小数点"];
                        return NO;
                    }
                }
                
                if (single == '.') {
                    
                    //text中还没有小数点
                    if(!isHaveDian) {
                        
                        isHaveDian = YES;
                        return YES;
                    }else {
                        
                        //只能有一个小数点
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        return NO;
                    }
                    
                }else {
                    
                    //存在小数点
                    if (isHaveDian) {
                        
                        //判断小数点的位数
                        NSRange ran = [textField.text rangeOfString:@"."];
                        NSInteger tt = range.location - ran.location;
                        if (tt <= 2){
                            return YES;
                        }else{
                            
                            //小数点后最多两位
                            return NO;
                        }
                        
                    }else {
                        
                        return YES;
                    }
                }
                
            }else{
                
                //输入的数据格式不正确 -> 金额只能输入数字和小数点
                [textField.text stringByReplacingCharactersInRange:range withString:@""];
                return NO;
            }
            
        }else {
            return YES;
        }
    }
}

个人博客:https://mortal-master.github.io

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容