1. 新建一類(CustomStringFormatter),在h文件中添加方法:
/**
?按指定格式和分隔符號(hào)輸出內(nèi)容
?@param content 待處理的內(nèi)容
?@param arrayFormat 比如電話號(hào)碼3-4-3顯示
?@param sep 分隔符號(hào) ,比如- or 空格
?@return 包括了分隔符號(hào)的字符串
?*/
- (NSString*)gotFormatterResultViaInputContent:(NSString*)content sepArray:(NSArray *)arrayFormat sepString:(NSString*)sep;
2. 具體實(shí)現(xiàn)如下:
@interface CustomStringFormatter()
/** 存放按指定格式分隔后的中間值 */
@property (nonatomic, strong) NSMutableDictionary *dic_result;
/** 按指定格式arrayFormat創(chuàng)建的數(shù)組敦锌,用于dic_result的key弥臼,防止arrayFormat里有重復(fù)的值比如處理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 - 處理第一步
/** 分為二個(gè)方法處理,第一為構(gòu)造中間結(jié)果靠胜,也就是dic_result */
- (void)zzjrp_recursionContent:(NSString*)inputContent sepArray:(NSArray *)arrayFormat keyArray:(NSArray *)arrayKey {
? ? //顯示和邏輯分離因痛,對(duì)inputContent做去分隔符處理,獲取真正要處理的字符
? ? NSString *str_content = [inputContent stringByReplacingOccurrencesOfString:self.str_sep withString:@""];
? ? if(str_content.length==0) {
? ? ? ? //無論是真正還沒開始輸入胰苏,還是用戶按了鍵盤上的刪除鍵硕蛹,這兒都會(huì)攔截到,處理方式是一樣的
? ? ? ? [self.dic_result removeAllObjects];
? ? ? ? return;
? ? }
? ? /*****======在輸入了或按了鍵盤上的刪除鍵后仍然有值的情況下才開始真正的處理======****/
? ? //第一個(gè)值應(yīng)有的長度 && 第一個(gè)key值的獲取
? ? NSString*str_firstValue = [arrayFormatfirstObject];
? ? NSString*str_key = [arrayKeyfirstObject];
? ? if(str_content.length<= str_firstValue.integerValue) {//輸入長度小于等于第一個(gè)分隔數(shù)值時(shí),直接原樣保存
? ? ? ? [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;
? ? }
? ? /*****======輸入長度大于第一個(gè)分隔數(shù)值時(shí)硕并,取剩下部分做遞歸======****/
? ? //創(chuàng)建遞歸數(shù)據(jù)源
? ? NSMutableArray*array = arrayFormat.mutableCopy;
? ? [arrayremoveObjectAtIndex:0];
? ? NSMutableArray*array2 = arrayKey.mutableCopy;
? ? [array2removeObjectAtIndex:0];
? ? if(array.count==0) {
? ? ? ? return;
? ? }
? ? //剩下的輸入的內(nèi)容
? ? NSString*str_rest = [str_contentsubstringFromIndex:str_firstValue.integerValue];
? ? if(str_rest) {
? ? ? ? //遞歸
? ? ? ? [self zzjrp_recursionContent:str_rest sepArray:array keyArray:array2];
? ? }
}
#pragma mark - 處理第二步
/** 分為二個(gè)方法處理,第二為構(gòu)造最終結(jié)果法焰,也就是包括了分隔符號(hào)的字符串 */
- (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;
}