美文网首页
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