이번에 두번째 계산기를 개발하다가 만들게된 콤마찍기 알고리즘(?)입니다. 구상하기는 생각보다 복잡했고 시간이 많이 걸렸는데 짜는데 시간은 얼마 안걸렸네요.. (허망)
아무튼 짠다고 고생했는데 혼자 썩히기엔 아까워서 공유합니다.
사용법
- 기본적으로 convertCommaFormula: 를 사용하면 문자열을 반환해줍니다.
- 추가적으로 convertCommaFormula:location: 을 사용하면 현재 커서 위치를 파라미터로 넣고 현재 커서 위치까지 반환(NSDictionary)해 줍니다.
저는 convertCommaFormula:location: 메서드를 구현해서 사용했었고 편의를 위해 convertCommaFormula: 를 뽑아보았습니다.
NSString *text = @"482193423+1284+41-(327123.4+2)"; NSString *resultText = [NSString convertCommaFormula:text]; NSLog(@"result : %@", resultText); // result : 482,193,423+1,284+41-(327,123.4+2)
코드
NSString+ConvertComma.h
#define COMMA_INDEX 3 @interface NSString (ConvertComma) + (NSString *) convertCommaFormula:(NSString *)formula ; + (NSDictionary *) convertCommaFormula:(NSString *)formula cursorlocation:(NSInteger)location ; @end
NSString+ConvertComma.m
@implementation NSString (ConvertComma) + (NSString *) convertCommaFormula:(NSString *)formula { return [NSString convertCommaFormula:formula cursorlocation:0][@"text"]; } + (NSDictionary *) convertCommaFormula:(NSString *)formula cursorlocation:(NSInteger)location { NSString *beforeCursorText = [formula substringWithRange:NSMakeRange(0, location)]; NSString *removedCommaBeforeCursorText = [beforeCursorText stringByReplacingOccurrencesOfString:@"," withString:@""]; NSString *removedText = [formula stringByReplacingOccurrencesOfString:@"," withString:@""]; NSMutableString *mBeforeText = [NSMutableString stringWithString:removedCommaBeforeCursorText]; NSMutableString *mOriginText = [NSMutableString stringWithString:removedText]; // 12|74 if (![LayoutInfo shared].isNotComma) { NSInteger numbercount = 0; for (NSInteger i=mOriginText.length-1; i>=0; i--) { char c = [mOriginText characterAtIndex:i]; if ('0'<=c && c<='9') { numbercount++; } else if (c=='.') { numbercount = 0; // 다시 되돌아가면서 콤마 지우기 for (NSInteger j=i; j<mOriginText.length; j++) { char cc = [mOriginText characterAtIndex:j]; if (cc==',') { [mOriginText replaceCharactersInRange:NSMakeRange(j, 1) withString:@""]; if (j<mBeforeText.length) { [mBeforeText replaceCharactersInRange:NSMakeRange(j, 1) withString:@""]; } j--; } else if ('0'<=cc && cc<='9') { continue; } else { if (i==j) continue; break; } } } else { numbercount = 0; } if (numbercount==COMMA_INDEX+1) { numbercount-=COMMA_INDEX; // i+1번째에 ,추가 [mOriginText replaceCharactersInRange:NSMakeRange(i+1, 0) withString:@","]; if (i+1<mBeforeText.length) { [mBeforeText replaceCharactersInRange:NSMakeRange(i+1, 0) withString:@","]; } } } } return @{@"text":mOriginText, @"cursorindex":@(mBeforeText.length)}; } @end
WRITTEN BY
- tucan.dev
개인 iOS 개발, tucan9389
,