美文网首页
对输入的数字4位加一个空格

对输入的数字4位加一个空格

作者: Sweet丶 | 来源:发表于2018-11-09 17:50 被阅读15次

在APP中,注册输入手机号、输入银行卡进行绑卡的操作是很常见的。下面介绍我的对输入框输入数字进行4位加一个空格的方法

思路
  1. 有3种情况需要处理【1. 键盘输入时 2.粘贴 3.KVO监听到赋值 】
  2. 因为多个页面会使用到这个功能,自己需要抽取方法
  3. 设置textfield的代理,在代理方法里面让textField调用抽取方法进行格式化
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
  1. KVO监听textField的text变化,在手动设置textField.text时,手动调用上述代理方法实现格式化
  2. 通常在用户输入text或者设置text后需要执行自己的业务逻辑,此时通过block回调的方式解决
具体实现
  1. 新建UITextField分类,抽取方法放在此分类下
/** 将输入框内用户输入的文字进行4位1空格格式化
 */
- (BOOL)bankCardFormatWithInputRange:(NSRange)range replacementString:(NSString *)string successInput:(void (^)())successInputBlock{
    // 每次输入了4位之后,如果此时是正在输入,则自动增加空格,如果正在删除,则自动删除空格!!!
    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\b"];// "\b"=退格
    // 先判断准备添加\替换的字符是不是合法
    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
    if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {// 找到了非法字符
        return NO;
    }
    NSString *text = self.text;
    text = [text stringByReplacingCharactersInRange:range withString:string];
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSString *newString = @"";
    while (text.length > 0) {
        
        NSString *subString = [text substringToIndex:MIN(text.length, 4)];
        newString = [newString stringByAppendingString:subString];
        if (subString.length == 4) {
            newString = [newString stringByAppendingString:@" "];
        }
        text = [text substringFromIndex:MIN(text.length, 4)];
    }
    
    newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];// 这一步把首尾两端不合规矩的字符去除掉
    
    if (newString.length > 24) {
        newString = [newString substringWithRange:NSMakeRange(0, 24)];
    }
    self.text = newString;
    
    successInputBlock();
    return NO;
}

/** 将输入框内用户输入的文字手机号码格式化 xxx xxxx xxxx
 */
- (BOOL)phoneNumberFormatWithInputRange:(NSRange)range replacementString:(NSString *)string successInput:(void (^)())successInputBlock{
    
    /**1.当到第四位或第九位时,如果此时是正在输入,则自动增加空格,如果正在删除,则自动删除空格!!!
     *2.当到第13位时,截取前面的13位字符串,
     *3.若想要获取输入的手机,需要先删除空格;
     */
    
    NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789\b"];// "\b"=退格
    // 先判断准备添加\替换的字符是不是合法
    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
    if ([string rangeOfCharacterFromSet:[characterSet invertedSet]].location != NSNotFound) {
        return NO;
    }
    NSString *text = self.text;
    text = [text stringByReplacingCharactersInRange:range withString:string];
    text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSMutableString *temString = [NSMutableString stringWithString:text];
    [temString insertString:@" " atIndex:0];
    text = temString;
    NSString *newString = @"";
    while (text.length > 0) {
        
        NSString *subString = [text substringToIndex:MIN(text.length, 4)];
        newString = [newString stringByAppendingString:subString];
        if (subString.length == 4) {
            newString = [newString stringByAppendingString:@" "];
        }
        text = [text substringFromIndex:MIN(text.length, 4)];
    }
    
    newString = [newString stringByTrimmingCharactersInSet:[characterSet invertedSet]];// 这一步把首尾两端不合规矩的字符去除掉
    
    if (newString.length > 13) {
        newString = [newString substringWithRange:NSMakeRange(0, 13)];
    }
    self.text = newString;
    successInputBlock();
    return NO;
}
  1. 具体类中使用
// 添加kvo监听
[self.phoneField addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

// 移除kvo监听,不移除在iOS9以下会闪退
- (void)dealloc{
    [self.phoneField removeObserver:self forKeyPath:@"text"];
}

// 监听到了textField改变时
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    if (object == self.phoneField  && [keyPath isEqualToString:@"text"]) {
        
        NSString *newNumber = change[NSKeyValueChangeNewKey];
        NSString *oldNumber = change[NSKeyValueChangeOldKey];
        if (![newNumber isEqualToString:oldNumber]) {
            [self textField:object shouldChangeCharactersInRange:NSMakeRange(0, [(UITextField *)object text].length) replacementString:newNumber];
        }
    }else{
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

// 以下是代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    
    if (textField == self.phoneField) {
        // 1. 键盘输入时 2.粘贴 3.KVO赋值 4.清除按钮点击
        
        return [textField phoneNumberFormatWithInputRange:range replacementString:string successInput:^{
            [self refreshSureBtnState];
        }];
    }else if(textField == self.bankCardNoField){
        
        return [textField bankCardFormatWithInputRange:range replacementString:string successInput:^{
            [self refreshSureBtnState];
        }];
    }
    return YES;
}
  1. 以上完结

相关文章

  • [vue]_.debounce-函数

    之前想做银行卡每输入4位数字加个空格,方案是监听用户输入然后加空格,或者是输入完了,监听失去焦点再去加空格(当然后...

  • 对输入的数字4位加一个空格

    在APP中,注册输入手机号、输入银行卡进行绑卡的操作是很常见的。下面介绍我的对输入框输入数字进行4位加一个空格的方...

  • 随手笔记

    Typora快捷键 无序列表:输入-之后输入空格 有序列表:输入数字+“.”之后输入空格 任务列表:-[空格]空格...

  • Web开发-工具篇typora

    windows快捷键: 无序列表:输入-之后输入空格 有序列表:输入数字+“.”之后输入空格 任务列表:-[空格]...

  • 中文排版指南

    1. 空格 中英文之间需要加空格eg. 中文和 English 中的空格都是一个占位符。 中文与数字之间需要加空格...

  • 常用正则

    输入数字 输入0~100数字 去除首尾空格 去除标签正则 去除右键复制

  • Leetcode.227.Basic Calculate II

    题目 进行+-*/运算,所有数都是正数,输入会有空格。 思路1 栈。将数字输入一个栈,将操作符输入一个栈。数字可能...

  • CAD圆环的快捷键DO

    圆环的快捷键DO加空格键后,出现一个圆环的内径输入数值后点空格,然后在输入圆弧的外径多少点空格后在点鼠标左键。就出...

  • 正常号转银行卡号

    正常号转银行卡号 - 增加4位间的空格 输入框每4位加一个空格

  • 输入框不允许输入 空格/特定的文字,或者将字母全部转换为大写

    可直接在html中写 不允许输入空格 只允许数字字母,其他不允许输入 总而言之,是在input上加事件,比如上面的...

网友评论

      本文标题:对输入的数字4位加一个空格

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