美文网首页
iOS | 小笔记:记账类APP常用的TextField

iOS | 小笔记:记账类APP常用的TextField

作者: 佳小豆 | 来源:发表于2018-07-18 11:34 被阅读73次

    小豆生活中一直有记账的小习惯(PS:特别推荐网易有钱,真是懒人记账的好帮手,阔以同步银行卡账单),记账类APP通常会用到类似这样TextField:
    “¥”一直处于金额的最前面;
    当完全删除金额的时候金额变成“0.00”。

    记账类APP常用的TextField效果图
    核心代码主要在UITextField的代理方法- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string中实现对金额的校验以及处理:
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSString *toBeString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        
        //当只剩下¥和一位金额不允许删除
        if ([string isEqualToString:@""])
        {
            if (textField.text.length == 2 || [textField.text isEqualToString:@"¥0.00"])
            {
                textField.text = @"¥0.00";
                return NO;
            }
        }
        
        BOOL hasDot = NO;
        
        if ([textField.text isEqualToString:@"¥0.00"])
        {
            textField.text = @"¥";
        }
        
        NSString *currentAmtStr = [textField.text stringByReplacingOccurrencesOfString:@"¥" withString:@""];
        NSString *toBeAmtStr = [toBeString stringByReplacingOccurrencesOfString:@"¥" withString:@""];
        
        //最大额度百亿,视具体情况而定
        if ([toBeAmtStr floatValue] >= 10000000000)
        {
            textField.text = [toBeString substringToIndex:toBeString.length - 1];
            return NO;
        }
        
        //判断是否有小数点
        if ([currentAmtStr containsString:@"."])
        {
            hasDot = YES;
        }
        else
        {
            hasDot = NO;
        }
        
        /*
         * 不能输入.0-9以外的字符。
         * 设置输入框输入的内容格式
         * 只能有一个小数点
         * 小数点后最多能输入两位
         * 如果第一位是.则前面加上0.
         * 如果第一位是0则后面必须输入点,否则不能输入。
         */
        
        if (string.length > 0)
        {
            //当前输入的字符
            unichar single = [string characterAtIndex:0];
            
            //不能输入.0-9以外的字符
            if (!((single >= '0' && single <= '9') || single == '.'))
            {
                return NO;
            }
            
            //只能有一个小数点
            if (hasDot && single == '.')
            {
                return NO;
            }
            
            //如果第一位是.补0
            if (((currentAmtStr.length == 0) && (single == '.')))
            {
                textField.text = @"¥0.";
                return NO;
            }
            
            //如果第一位是0则后面必须输入点,否则不能输入
            if ((([currentAmtStr isEqualToString:@"0"]) && (single != '.')))
            {
                return NO;
            }
            
            //小数点后最多能输入两位
            if (hasDot)
            {
                NSRange ran = [currentAmtStr rangeOfString:@"."];
                if (range.location > ran.location)
                {
                    if ([currentAmtStr pathExtension].length > 1)
                    {
                        return NO;
                    }
                }
            }
            return YES;
        }
        else
        {
            return YES;
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS | 小笔记:记账类APP常用的TextField

          本文链接:https://www.haomeiwen.com/subject/npxopftx.html