0

私のアプリケーションにUITextFieldは、番号を受け取る a があります。

この数値を次のような特定の形式で表す必要があります。(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);

このコードの最後に、次の 2 つがあります。

  1. string : テキストの文字列表現 (例: 6212341234a NSString)
  2. myNumber : この文字列の番号 (例: 6212341234a NSNumber)

この文字列を作成するにはどうすればよいですか:または(62) 1234 1234に基づいて?myNumberstring

編集

rdelmar の質問への回答:

数字には 10 個または 11 個の数字を含めることができ、次のようにそれらを区切るつもりです: (62) 1234 1234または(62) 12345 1234

4

2 に答える 2

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)  

このようにして、中間文字列をフォーマッタに渡すことができ、フォーマッタは正しいことをしようとします。

于 2012-09-29T16:48:49.117 に答える
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) xxxx xxxx に分割され、別の数字を入力すると (xx) xxxxx 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;
}
于 2012-09-28T21:13:07.263 に答える