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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容