2012-09-28 81 views
0

我的應用程序中有一個UITextField接收號碼。NSNumber到NSString轉換的自定義格式

我想,要在一個特定的格式來表示這個數字,是這樣的:(62) 1234 1234

的問題是:我已經擁有控制權的方法-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string但我不知道我怎樣才能使這個「面具」

目前我真的做這樣的:

string = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
string = [[string componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""]; 

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber * myNumber = [f numberFromString:string]; 
NSLog(@"%@", myNumber); 

這段代碼的最後,我有兩兩件事:

  1. 字符串:我的文本的字符串表示形式(例如, 6212341234作爲NSString
  2. mynumber的:數量此字符串(例如6212341234作爲NSNumber

我怎樣才能建立這個字符串:基於myNumberstring(62) 1234 1234

編輯

應對rdelmar問題:

數量可以有10首或11個數字,我打算給他們這樣的分離: (62) 1234 1234(62) 12345 1234

+0

數字總是10位數字嗎?而且,你是否總希望按照上面展示的方式將它分開? – rdelmar

+0

請查閱我的編輯請 –

+0

這實際上是一個電話號碼嗎?看起來像它,從你試圖實現的格式。如果是這樣,請將其視爲字符串並使用子字符串。 –

回答

1

你可以使用NSRegularExpression ...

- (NSString *) formattedString:(NSString *)inputString 
{ 
    NSError *error = NULL; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:([0-9]{2})([0-9]{5})([0-9]{4}))|(?:([0-9]{0,2}+)([0-9]{0,4}+)([0-9]{0,4}+))" options:0 error:&error]; 
    NSArray *components = [NSArray array]; 
    NSArray *matches = [regex matchesInString:inputString options:0 range:NSMakeRange(0, [inputString length])]; 
    NSTextCheckingResult *match = [matches objectAtIndex:0]; 
    for (NSUInteger i = 1; i <= 3; ++i) 
    { 
     NSRange range = [match rangeAtIndex:i]; 
     if (NSNotFound == range.location) 
     { 
      break; 
     } 
     components = [components arrayByAddingObject:[inputString substringWithRange:range]]; 
    } 
    if (0 == [components count]) 
    { 
     for (NSUInteger i = 4; i <= 6; ++i) 
     { 
      NSRange range = [match rangeAtIndex:i]; 
      components = [components arrayByAddingObject:[inputString substringWithRange:range]]; 
     } 
    } 
    return [NSString stringWithFormat:@"(%@) %@ %@", 
      [components objectAtIndex:0], 
      [components objectAtIndex:1], 
      [components objectAtIndex:2]]; 
} 


- (void) testFormatting 
{ 
    NSLog(@"%@", [self formattedString:@"62123451234"]); 
    NSLog(@"%@", [self formattedString:@"6212341234"]); 
    NSLog(@"%@", [self formattedString:@"621234123"]); 
    NSLog(@"%@", [self formattedString:@"62123412"]); 
    NSLog(@"%@", [self formattedString:@"6212341"]); 
    NSLog(@"%@", [self formattedString:@"621234"]); 
    NSLog(@"%@", [self formattedString:@"62123"]); 
    NSLog(@"%@", [self formattedString:@"6212"]); 
    NSLog(@"%@", [self formattedString:@"621"]); 
    NSLog(@"%@", [self formattedString:@"62"]); 
    NSLog(@"%@", [self formattedString:@"6"]); 
} 

調用testFormatting方法的結果是:

(62) 12345 1234 
(62) 1234 1234 
(62) 1234 123 
(62) 1234 12 
(62) 1234 1 
(62) 1234 
(62) 123 
(62) 12 
(62) 1 
(62) 
(6) 

這種方式,您可以通過中間字符串格式化,它會嘗試做正確的事情。

+0

謝謝,那正是我正在尋找的 –

0

你可以做到這一點像這樣的東西(10位數字):

-(NSString *)formatString:(NSString *) input { 
    NSString *part1 = [NSString stringWithFormat:@"(%@)",[input substringToIndex:2]]; 
    NSString *part2 = [input substringWithRange:NSMakeRange(2, 4)]; 
    NSString *part3 = [input substringWithRange:NSMakeRange(6, 4)]; 
    NSString *formatted = [NSString stringWithFormat:@"%@ %@ %@",part1,part2,part3]; 
    return formatted; 

} 

要處理10或11位數字,您必須在if子句中測試長度,然後相應地更改part2和part3的範圍。

編輯後:如何這樣的事情。我認爲這與做得一樣好。當你鍵入時,它會將它分成(xx)x​​xxx xxxx,如果你鍵入另一個數字,它會將它分成(xx)x​​xxxx xxxx。任何進一步的輸入被忽略。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    if (textField.text.length == 0) 
    textField.text = [NSString stringWithFormat:@"(%@",textField.text]; 

    if (textField.text.length == 3) 
     textField.text = [NSString stringWithFormat:@"%@) ",textField.text]; 

    if (textField.text.length == 9) 
     textField.text = [NSString stringWithFormat:@"%@ ",textField.text]; 

    if (textField.text.length == 14) { 
     NSString *part1 = [textField.text substringToIndex:9]; 
     part1 = [part1 stringByAppendingString:[textField.text substringWithRange:NSMakeRange(10, 1)]]; 
     NSString *part2 = [textField.text substringWithRange:NSMakeRange(11, 3)]; 
     textField.text = [NSString stringWithFormat:@"%@ %@",part1,part2]; 
    } 

    if (textField.text.length > 14) 
     return NO; 

    return YES; 
} 
+0

在我的應用程序中,字符串格式化是在用戶輸入新數字的同時進行的。因爲這個我沒有10-11數字的完整字符串。因爲那個''substringWithRange:''不會工作 –

+0

你應該在開始時提到。我不認爲有什麼辦法可以讓你完全正確地輸入,因爲沒有辦法知道用戶是輸入一個11位還是10位的數字。因此,直到最後一位數字輸入後才能確定最後2個部分之間的中斷。 – rdelmar

+0

@NicosKaralis,看我編輯的答案。 – rdelmar