Как я могу отформатировать NSTextField или UITextField? - PullRequest
4 голосов
/ 27 января 2012

Я хочу отформатировать любой текст, помещенный в NSTextField / UITextField, чтобы он выглядел как

###-###-####

Вот некоторые возможные входные данные

1112223333
111.222.3333
(111)222-3333
(111) 2223333

Ответы [ 3 ]

3 голосов
/ 30 января 2012

Я протестировал этот код, и он работает для всех ваших примеров:

- (NSString *)convertNumber:(NSString *)input {
    NSMutableString *result = [NSMutableString stringWithCapacity:15];
    NSScanner *scanner = [NSScanner scannerWithString:input];
    NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"1234567890"];
    NSString *temp;
    NSInteger location = 0;

    // Get first group
    [scanner scanUpToCharactersFromSet:numbers intoString:&temp];
    location = [scanner scanLocation];
    [scanner scanCharactersFromSet:numbers intoString:&temp];
    [result appendString:temp];

    if ([scanner scanLocation] < location + 4) {
        // Only scanned three numbers - get second group
        [scanner scanUpToCharactersFromSet:numbers intoString:&temp];
        location = [scanner scanLocation];
        [scanner scanCharactersFromSet:numbers intoString:&temp];
        [result appendString:temp];

        if ([scanner scanLocation] < location + 4) {
            // Only scanned three numbers - get last group
            [scanner scanUpToCharactersFromSet:numbers intoString:&temp];
            [scanner scanCharactersFromSet:numbers intoString:&temp];
            [result appendString:temp];
        }
    } else if ([scanner scanLocation] < location + 7) {
        // Scanned six numbers - get last group
        [scanner scanUpToCharactersFromSet:numbers intoString:&temp];
        [scanner scanCharactersFromSet:numbers intoString:&temp];
        [result appendString:temp];
    }

    // Add dashes
    if ([result length] > 6) {
        [result insertString:@"-" atIndex:3];
        [result insertString:@"-" atIndex:7];
    }

    return result;
}

Любое количество нечисловых символов (или ни одного) между группами 3, 3 и 4 будет игнорироваться.

Предупреждение: может произойти утечка повсюду и может произойти сбой при непредвиденном вводе.

1 голос
/ 05 февраля 2012

Регулярные выражения - ваш друг:

NSString * reformat( NSString * number )
{
    NSRegularExpression * noDigits = 
        [ NSRegularExpression regularExpressionWithPattern: @"\\D" options: 0  error: NULL ] ;

    NSString * onlyDigits = [ noDigits stringByReplacingMatchesInString: number
                                                                options: 0
                                                                  range: NSMakeRange ( 0, number.length )
                                                           withTemplate: @"" ] ;

    NSRegularExpression * phoneNumberPattern =
        [ NSRegularExpression regularExpressionWithPattern: @"^(\\d\\d\\d)(\\d\\d\\d)(\\d\\d\\d\\d)$"
                                                   options: 0
                                                     error: NULL ] ;
    NSString * result = [ phoneNumberPattern stringByReplacingMatchesInString: onlyDigits 
                                                                      options: 0 
                                                                        range: NSMakeRange( 0, onlyDigits.length )
                                                                 withTemplate: @"$1-$2-$3" ] ;
    return result ;
}

Возможно, вы захотите проверить некоторые альтернативы последней замене сопоставления с образцом на случай, если вы столкнетесь с чем-то, кроме 10 цифр. В качестве альтернативы, поставьте проверку длины сразу после вычисления onlyDigits.

0 голосов
/ 03 февраля 2012

Попробуйте этот метод

-(void)NumberFormatter:(NSString *)originalString
{

    NSCharacterSet * set = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ"];

    if ([originalString rangeOfCharacterFromSet:set].location == NSNotFound) 
    {
        NSMutableString *strippedString = [NSMutableString 
                                           stringWithCapacity:originalString.length];

        NSScanner *scanner = [NSScanner scannerWithString:originalString];
        NSCharacterSet *numbers = [NSCharacterSet 
                                   characterSetWithCharactersInString:@"0123456789"];

        while ([scanner isAtEnd] == NO) {
            NSString *buffer;
            if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
                [strippedString appendString:buffer];

            } else {
                [scanner setScanLocation:([scanner scanLocation] + 1)];
            }
        }


        if ([strippedString length]<10) {
            NSLog(@"it is invalid string ,must contain atleast 10 numbers");
        }
        else
        {
            NSString *finalstring= [NSString stringWithFormat:@"%@-%@-%@",[strippedString substringWithRange:NSMakeRange(0, 3)],[strippedString substringWithRange:NSMakeRange(3, 3)],[strippedString substringFromIndex:6]];
            NSLog(@"This is the formatted number==%@",finalstring);
        }
    }
    else
        NSLog(@"string is invalid,It contains characters");
}
...