小豆生活中一直有记账的小习惯(PS:特别推荐网易有钱,真是懒人记账的好帮手,阔以同步银行卡账单),记账类APP通常会用到类似这样TextField:
“¥”一直处于金额的最前面;
当完全删除金额的时候金额变成“0.00”。
核心代码主要在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;
}
}
网友评论