1. 新建一类(CustomStringFormatter),在h文件中添加方法:
/**
按指定格式和分隔符号输出内容
@param content 待处理的内容
@param arrayFormat 比如电话号码3-4-3显示
@param sep 分隔符号 ,比如- or 空格
@return 包括了分隔符号的字符串
*/
- (NSString*)gotFormatterResultViaInputContent:(NSString*)content sepArray:(NSArray *)arrayFormat sepString:(NSString*)sep;
2. 具体实现如下:
@interface CustomStringFormatter()
/** 存放按指定格式分隔后的中间值 */
@property (nonatomic, strong) NSMutableDictionary *dic_result;
/** 按指定格式arrayFormat创建的数组,用于dic_result的key,防止arrayFormat里有重复的值比如处理3-4-4这样的情况 */
@property (nonatomic, strong) NSArray *array_keys;
@property (nonatomic, strong) NSArray *array_format;
@property (nonatomic, copy) NSString *str_sep;
@end
@implementation CustomStringFormatter
- (NSString*)gotFormatterResultViaInputContent:(NSString*)content sepArray:(NSArray *)arrayFormat sepString:(NSString*)sep {
self.str_sep= sep;
self.array_format= arrayFormat;
[self zzjrp_recursionContent:content sepArray:arrayFormat keyArray:self.array_keys];
NSLog(@"中间值:%@",self.dic_result);
if(self.dic_result.count>0) {
return [self zzjrp_combineWithKeyArray:self.array_keys];
}
return @"";
}
#pragma mark - 处理第一步
/** 分为二个方法处理,第一为构造中间结果,也就是dic_result */
- (void)zzjrp_recursionContent:(NSString*)inputContent sepArray:(NSArray *)arrayFormat keyArray:(NSArray *)arrayKey {
//显示和逻辑分离,对inputContent做去分隔符处理,获取真正要处理的字符
NSString *str_content = [inputContent stringByReplacingOccurrencesOfString:self.str_sep withString:@""];
if(str_content.length==0) {
//无论是真正还没开始输入,还是用户按了键盘上的删除键,这儿都会拦截到,处理方式是一样的
[self.dic_result removeAllObjects];
return;
}
/*****======在输入了或按了键盘上的删除键后仍然有值的情况下才开始真正的处理======****/
//第一个值应有的长度 && 第一个key值的获取
NSString*str_firstValue = [arrayFormatfirstObject];
NSString*str_key = [arrayKeyfirstObject];
if(str_content.length<= str_firstValue.integerValue) {//输入长度小于等于第一个分隔数值时,直接原样保存
[self.dic_resultsetObject:str_contentforKey:str_key];
//解决退格键引起的值的变化
for(inti =0; i < arrayKey.count; i ++) {
NSString*tmp = arrayKey[i];
if(![str_keyisEqualToString:tmp]) {
[self.dic_resultremoveObjectForKey:tmp];
}
}
return;
}
/*****======输入长度大于第一个分隔数值时,取剩下部分做递归======****/
//创建递归数据源
NSMutableArray*array = arrayFormat.mutableCopy;
[arrayremoveObjectAtIndex:0];
NSMutableArray*array2 = arrayKey.mutableCopy;
[array2removeObjectAtIndex:0];
if(array.count==0) {
return;
}
//剩下的输入的内容
NSString*str_rest = [str_contentsubstringFromIndex:str_firstValue.integerValue];
if(str_rest) {
//递归
[self zzjrp_recursionContent:str_rest sepArray:array keyArray:array2];
}
}
#pragma mark - 处理第二步
/** 分为二个方法处理,第二为构造最终结果,也就是包括了分隔符号的字符串 */
- (NSString*)zzjrp_combineWithKeyArray:(NSArray *)arrayKey {
NSMutableString *str_space = [NSMutableString string];
for(inti =0; i < arrayKey.count; i ++) {
NSString*str_key = arrayKey[i];
NSString*str_input = [self.dic_resultobjectForKey:str_key];
if(str_input) {
[str_spaceappendFormat:@"%@%@",str_input,self.str_sep];
}
}
//如果最后一位有分隔符,去掉
NSString*str_last = [str_spacesubstringFromIndex:str_space.length-1];
if([str_lastisEqualToString:self.str_sep]) {
return[str_spacesubstringToIndex:str_space.length-1];
}
returnstr_space;
}
#pragma mark - Setter methos
- (NSMutableDictionary *)dic_result {
if (!_dic_result) {
_dic_result = [NSMutableDictionary dictionary];
}
return _dic_result;
}
- (NSArray*)array_keys {
if (!_array_keys) {
NSMutableArray*array_tmp =@[].mutableCopy;
for(inti =10; i
[array_tmpaddObject:[NSStringstringWithFormat:@"%d",i]];
}
_array_keys= array_tmp;
}
return _array_keys;
}