【问题标题】:How can I format an NSTextField or UITextField?如何格式化 NSTextField 或 UITextField?
【发布时间】:2012-01-27 16:26:27
【问题描述】:

我想将放置在 NSTextField/UITextField 中的任何文本格式化为看起来像

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

这里有一些可能的输入

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

【问题讨论】:

    标签: objective-c nsstring uitextfield format nstextfield


    【解决方案1】:

    我已经测试了这段代码,它适用于您的所有示例:

    - (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 组之间的任何数量的非数字字符(或无)都将被忽略。

    警告:它可能会到处泄漏,如果输入意外输入可能会崩溃。

    【讨论】:

    • 我发现了一个错误,如果号码是 888222-3456,它会崩溃。
    • 它不应该因为输入而崩溃,而只是打印888222。我将编辑我的答案以抓住这一点。
    【解决方案2】:

    正则表达式是你的朋友:

    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 之后立即进行长度检查。

    【讨论】:

      【解决方案3】:

      试试这个方法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        相关资源
        最近更新 更多