ValidateUtil.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. //
  2. // ValidateUtil.m
  3. // AoT
  4. //
  5. // Created by Jason Lee on 8/5/14.
  6. // Copyright (c) 2014 JasonDevelop All rights reserved.
  7. //
  8. #import "JDObject.h"
  9. #import "ValidateUtil.h"
  10. @implementation ValidateUtil
  11. + (NSString *)getUTF8String:(NSString *)hanggulString {
  12. NSArray *chosung = [[NSArray alloc] initWithObjects:@"ㄱ",@"ㄲ",@"ㄴ",@"ㄷ",@"ㄸ",@"ㄹ",@"ㅁ",@"ㅂ",@"ㅃ",@"ㅅ",@"ㅆ",@"ㅇ",@"ㅈ",@"ㅉ",@"ㅊ",@"ㅋ",@"ㅌ",@"ㅍ",@"ㅎ",nil];
  13. NSArray *jungsung = [[NSArray alloc] initWithObjects:@"ㅏ",@"ㅐ",@"ㅑ",@"ㅒ",@"ㅓ",@"ㅔ",@"ㅕ",@"ㅖ",@"ㅗ",@"ㅘ",@"ㅙ",@"ㅚ",@"ㅛ",@"ㅜ",@"ㅝ",@"ㅞ",@"ㅟ",@"ㅠ",@"ㅡ",@"ㅢ",@"ㅣ",nil];
  14. NSArray *jongsung = [[NSArray alloc] initWithObjects:@"",@"ㄱ",@"ㄲ",@"ㄳ",@"ㄴ",@"ㄵ",@"ㄶ",@"ㄷ",@"ㄹ",@"ㄺ",@"ㄻ",@"ㄼ",@"ㄽ",@"ㄾ",@"ㄿ",@"ㅀ",@"ㅁ",@"ㅂ",@"ㅄ",@"ㅅ",@"ㅆ",@"ㅇ",@"ㅈ",@"ㅊ",@"ㅋ",@" ㅌ",@"ㅍ",@"ㅎ",nil];
  15. NSString *textResult = @"";
  16. for (int i=0;i<[hanggulString length];i++) {
  17. NSInteger code = [hanggulString characterAtIndex:i];
  18. if (code >= 44032 && code <= 55203) {
  19. NSInteger uniCode = code - 44032;
  20. NSInteger chosungIndex = uniCode / 21 / 28;
  21. NSInteger jungsungIndex = uniCode % (21 * 28) / 28;
  22. NSInteger jongsungIndex = uniCode % 28;
  23. textResult = [NSString stringWithFormat:@"%@%@%@%@", textResult, [chosung objectAtIndex:chosungIndex], [jungsung objectAtIndex:jungsungIndex], [jongsung objectAtIndex:jongsungIndex]];
  24. }
  25. }
  26. return textResult;
  27. }
  28. + (NSString *)appendPrefix:(NSString *)text {
  29. NSString *parted = [ValidateUtil getUTF8String:text];
  30. NSArray *jongsung = [[NSArray alloc] initWithObjects:@"",@"ㄱ",@"ㄲ",@"ㄳ",@"ㄴ",@"ㄵ",@"ㄶ",@"ㄷ",@"ㄹ",@"ㄺ",@"ㄻ",@"ㄼ",@"ㄽ",@"ㄾ",@"ㄿ",@"ㅀ",@"ㅁ",@"ㅂ",@"ㅄ",@"ㅅ",@"ㅆ",@"ㅇ",@"ㅈ",@"ㅊ",@"ㅋ",@" ㅌ",@"ㅍ",@"ㅎ",nil];
  31. NSString *lastword = [parted substringFromIndex:[parted length]-1];
  32. BOOL hasJongsung = NO;
  33. for (NSString *chr in jongsung) {
  34. if (!hasJongsung && [lastword isEqualToString:chr]) {
  35. hasJongsung = YES;
  36. break;
  37. }
  38. }
  39. return hasJongsung ? [NSString stringWithFormat:@"%@을", text] : [NSString stringWithFormat:@"%@를", text];
  40. }
  41. #pragma mark - 정규표현식
  42. + (BOOL)validateCellular:(NSString *)phone {
  43. NSString *regEx = @"[01]{2}[0-9]{8}|[01]{2}[0-9]{9}$";
  44. NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
  45. return [pred evaluateWithObject:phone];
  46. }
  47. + (BOOL)validateNickname:(NSString *)nickname {
  48. //) 10 ~ 20Byte 이내 영문, 숫자, 영문과 숫자, 한글 조합
  49. NSString *regEx = @"[A-Za-z0-9가-힣_]{1,10}$";
  50. NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
  51. return [pred evaluateWithObject:nickname];
  52. }
  53. + (BOOL)validateUserPasswd:(NSString *)rPasswd {
  54. // 8자이상, 영문자,숫자,특수문자 2가지 이상이 포함되어야함.
  55. NSString *regEx = @"[A-Z0-9a-z]{4,10}";
  56. NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
  57. return [pred evaluateWithObject:rPasswd];
  58. }
  59. + (BOOL)validateEmail:(NSString*)email {
  60. //이메일 형식 검사
  61. NSString *regEx = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
  62. NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
  63. return [pred evaluateWithObject:email];
  64. }
  65. + (BOOL)validateNumeric:(NSString *)numString {
  66. //숫자 형식 검사
  67. NSString *regEx = @"[0-9.]*$";
  68. NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
  69. return [pred evaluateWithObject:numString];
  70. }
  71. + (BOOL)validateUserBirth:(NSString *)birth {
  72. NSString *date = [birth stringByReplacingOccurrencesOfString:@"-" withString:ksEmptyString];
  73. date = [date stringByReplacingOccurrencesOfString:@"." withString:ksEmptyString];
  74. //생년월일 검사
  75. NSString *regEx = @"[1,2]{1}[0-9]{7}$";
  76. NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];
  77. return [pred evaluateWithObject:date];
  78. }
  79. + (BOOL)validateUserShortBirth:(NSString *)birth {//생년월일 6자리
  80. NSString *date = [birth stringByReplacingOccurrencesOfString:@"-" withString:ksEmptyString];
  81. date = [date stringByReplacingOccurrencesOfString:@"." withString:ksEmptyString];
  82. if (date.length != 6)
  83. return NO;
  84. NSString *month = [date substringWithRange:NSMakeRange(2, 2)];
  85. if (![ValidateUtil validateNumeric:date]) {//Month 체크
  86. return NO;
  87. }
  88. if (![ValidateUtil validateMonth:month]) {//Month 체크
  89. return NO;
  90. }
  91. if (![ValidateUtil validateDay:[date substringWithRange:NSMakeRange(4, 2)] month:month]) {//Month 체크
  92. return NO;
  93. }
  94. return YES;
  95. }
  96. + (BOOL)validateCardYear:(NSString *)yearString {
  97. if (![ValidateUtil validateNumeric:yearString]) {//숫자형식이 아니면 리턴.
  98. return NO;
  99. }
  100. NSInteger sYear = [yearString intValue];
  101. //현재 연도를 구함.
  102. NSString *nowDate = [CommonUtil stringFromDate:[NSDate date]];
  103. NSString *yearStr = [NSString stringWithFormat:@"%zd", [CommonUtil dateComponentsFromString:nowDate].year];
  104. NSInteger rYear = [[yearStr substringFromIndex:2] intValue];
  105. //현재연도와 같거나 10년후보다 작음.
  106. return sYear >= rYear && sYear <= rYear + 10;
  107. }
  108. + (BOOL)validateMonth:(NSString *)monthString {
  109. if (![ValidateUtil validateNumeric:monthString]) {//숫자형식이 아니면 리턴.
  110. return NO;
  111. }
  112. NSInteger sMonth = [monthString intValue];
  113. return sMonth >= 1 && sMonth <= 12;
  114. }
  115. + (BOOL)validateDay:(NSString *)dayString month:(NSString *)monthString {
  116. if (![ValidateUtil validateNumeric:dayString]) {//숫자형식이 아니면 리턴.
  117. return NO;
  118. }
  119. NSInteger sMonth = [monthString intValue];
  120. NSInteger sDay = [dayString intValue];
  121. if (sMonth == 1 || sMonth == 3 || sMonth == 5 || sMonth == 7 || sMonth == 8 || sMonth == 10 || sMonth == 12) {//큰달이면,
  122. return sDay >= 1 && sDay <= 31;
  123. } else if (sMonth == 2) {//2월이면,
  124. return sDay >= 1 && sDay <= 29;
  125. }
  126. return sDay >= 1 && sDay <= 30;
  127. }
  128. + (BOOL)validateCardNumber:(NSString *)numString {
  129. if (![ValidateUtil validateNumeric:numString]) {//숫자형식이 아니면 리턴.
  130. return NO;
  131. }
  132. return numString.length == 4;
  133. }
  134. + (BOOL)ValidateDate:(NSString *)dateString {
  135. return [CommonUtil dateFromDateString:dateString] != nil;
  136. }
  137. + (void)alert:(NSString *)message {
  138. [[JDFacade facade] alert:message];
  139. // UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  140. // [alert show];
  141. }
  142. + (BOOL)validateTextfiled:(UITextField *)textfield type:(ValidateType)type title:(NSString *)title {
  143. BOOL isValid = NO;
  144. switch (type) {
  145. case ValidateTypeNull:
  146. isValid = !(!textfield.text || [textfield.text isEqualToString:ksEmptyString]);
  147. if (!isValid) {
  148. NSString *message = [NSString stringWithFormat:@"%@ 입력하세요.", [ValidateUtil appendPrefix:title]];
  149. [ValidateUtil alert:message];
  150. } else {
  151. //check emoji
  152. isValid = ![CommonUtil stringContainsEmoji:textfield.text];
  153. if (!isValid) {
  154. NSString *message = @"이모지를 사용할 수 없습니다.";
  155. [ValidateUtil alert:message];
  156. }
  157. }
  158. break;
  159. case ValidateTypeNumber:
  160. if ([ValidateUtil validateTextfiled:textfield type:ValidateTypeNull title:title]) {
  161. if (!(isValid = [ValidateUtil validateNumeric:textfield.text])) {
  162. NSString *message = [NSString stringWithFormat:@"%@ 형식이 올바르지 않습니다.\n다시 입력해주세요.", title];
  163. [ValidateUtil alert:message];
  164. }
  165. }
  166. break;
  167. case ValidateTypeMobile:
  168. if ([ValidateUtil validateTextfiled:textfield type:ValidateTypeNull title:title]) {
  169. if (!(isValid = [ValidateUtil validateCellular:textfield.text])) {
  170. NSString *message = [NSString stringWithFormat:@"%@ 형식이 올바르지 않습니다.\n다시 입력해주세요.", title];
  171. [ValidateUtil alert:message];
  172. }
  173. }
  174. break;
  175. case ValidateTypeEmail:
  176. if ([ValidateUtil validateTextfiled:textfield type:ValidateTypeNull title:title]) {
  177. if (!(isValid = [ValidateUtil validateEmail:textfield.text])) {
  178. NSString *message = [NSString stringWithFormat:@"%@ 형식이 올바르지 않습니다.\n다시 입력해주세요.", title];
  179. [ValidateUtil alert:message];
  180. }
  181. }
  182. break;
  183. case ValidateTypePassword:
  184. if ([ValidateUtil validateTextfiled:textfield type:ValidateTypeNull title:title]) {
  185. if (!(isValid = [ValidateUtil validateUserPasswd:textfield.text])) {
  186. NSString *message = [NSString stringWithFormat:@"비밀번호는 8자이상\n영문자,숫자,특수문자 중\n2가지 이상이 포함되어야 합니다."];
  187. [ValidateUtil alert:message];
  188. }
  189. }
  190. break;
  191. case ValidateTypeNickname:
  192. if ([ValidateUtil validateTextfiled:textfield type:ValidateTypeNull title:title]) {
  193. if (!(isValid = [ValidateUtil validateNickname:textfield.text])) {
  194. NSString *message = [NSString stringWithFormat:@"%@ 형식이 올바르지 않습니다.\n다시 입력하세요.\n닉네임에 공백은 사용할 수 없습니다.\n10자 이내로 작성해 주세요.", title];
  195. [ValidateUtil alert:message];
  196. }
  197. }
  198. break;
  199. case ValidateTypeDate:
  200. if ([ValidateUtil validateTextfiled:textfield type:ValidateTypeNull title:title]) {
  201. if (!(isValid = [ValidateUtil ValidateDate:textfield.text])) {
  202. NSString *message = [NSString stringWithFormat:@"%@ 형식이 올바르지 않습니다.\n다시 선택하세요.", title];
  203. [ValidateUtil alert:message];
  204. }
  205. }
  206. break;
  207. }
  208. return isValid;
  209. }
  210. + (BOOL)validateTextView:(UITextView *)textview type:(ValidateType)type title:(NSString *)title {
  211. BOOL isValid = NO;
  212. switch (type) {
  213. case ValidateTypeNull:
  214. isValid = !(!textview.text || [textview.text isEqualToString:ksEmptyString]);
  215. if (!isValid) {
  216. NSString *message = [NSString stringWithFormat:@"%@ 입력하세요.", [ValidateUtil appendPrefix:title]];
  217. [ValidateUtil alert:message];
  218. }
  219. break;
  220. default:
  221. break;
  222. }
  223. return isValid;
  224. }
  225. @end