简体   繁体   English

如何格式化NSTextField或UITextField?

[英]How can I format an NSTextField or UITextField?

I want to format any text that is placed into a NSTextField/UITextField to look like 我想格式化放置在NSTextField / UITextField中的任何文本

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

Here are some possible inputs 以下是一些可能的输入

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

I've tested this code and it works for all of your examples: 我已经测试了这段代码,它适用于所有示例:

- (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;
}

Any quantity of non-numeric characters (or none) between the groups of 3, 3 and 4 will be ignored. 将忽略3,3和4组之间的任何数量的非数字字符(或无)。

Warning: it may leak all over the place, and could crash if given unexpected input. 警告:它可能会在整个地方泄漏,如果给出意外输入可能会崩溃。

Regular expressions are your friend: 正则表达式是你的朋友:

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 ;
}

You might want to check out some alternatives to the last pattern-matching replacement in case you are confronted with something other than 10 digits. 您可能想要查看最后一个模式匹配替换的一些替代方法,以防您遇到10位以外的其他内容。 Alternatively, put in a length check right after onlyDigits is computed. 或者,在计算onlyDigits之后onlyDigits进行长度检查。

Try this method 试试这个方法

-(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");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM