UITextField输入限制为小数点后两位,禁用其复制粘贴等方法

输入金额的文本框是一个逻辑比较复杂的问题,要考虑的条件也比较的多。我考虑的主要有以下几点:

1、输入数字保留至小数点后两位

2、只能输入一个小数点(因为之前看到别人博客的代码遗漏了这一点)

3、如果用户第一个输入的是小数点,则自动为其填充 ‘.’ 前的 ‘0’

下面是代码,引用时需要设置一个纪录小数点个数的全局变量,如下:

@property (nonatomic,assign)NSInteger   numberOfPoint;  //小数点个数

 

主体代码如下:

 1 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

 2     NSMutableString * currentString = [NSMutableString stringWithString:textField.text];

 3     NSMutableString * futureString = [NSMutableString stringWithFormat:@"%@%@",currentString,string];

 4     NSLog(@"length:%lu  location:%lu",range.length,range.location);

 5     

 6     NSInteger flag=0;

 7     const NSInteger limited = 2;

 8     

 9     //1、如果text field中没有字符,且输入的字符位 ‘.’,则自动填充 ‘0’

10     if (textField.text.length < 1 && [string isEqual:@"."]) {

11         textField.text = @"0";

12         _numberOfPoint ++;

13         return YES;

14     }else{

15         //只能有一个小数点

16         if (_numberOfPoint == 1 && [string isEqual:@"."]) {

17             return NO;

18         }

19         if (_numberOfPoint == 0 && [string isEqual:@"."]) {

20             _numberOfPoint ++;

21         }

22         

23         if (range.location < futureString.length - 3) {

24             NSLog(@"正常输入");

25         }else{

26             //从后往前遍历字符串flag用于记录小数点后的数字位数

27             for (int i = (int)futureString.length-1 ; i>=0; i--) {

28                 if ([futureString characterAtIndex:i] == '.') {

29                     if (flag > limited) {

30                         //回收键盘

31                         [textField resignFirstResponder];

32                         return NO;

33                     }

34                     break;

35                 }

36                 flag++;

37             }

38         }

39     }

40     return YES;

41 }

 

上面这些考虑完之后,还可以有下面这些考虑:

1、禁用输入框的选择、复制、粘贴等功能

要实现上面的这个考虑需要写一个继承于UITextField的类,重写canPerformAction: withSender:方法就可以了,尤其他需要的话可以根据规律进行设置。

主体代码如下:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{

    if (action == @selector(paste:)  ||     //粘贴

        action == @selector(select:) ||     //选择

        action == @selector(selectAll:))    //全选

    {

        return NO;

    }

    return [super canPerformAction:action withSender:sender];

}

 

如果有些地方不合理,欢迎提出意见!

 

你可能感兴趣的:(UITextField)