电话号码格式ios

时间:2014-02-28 10:37:40

标签: ios nsstring

在我的应用程序中,我将电话号码作为用户的输入。号码应采用美国格式。我想动态地显示它(555)-888-888。例如,当用户在达到4位时开始输入数字时,它显示如下的数字(555)-4,依此类推。我试着替换了String方法,但我发现它不起作用。

6 个答案:

答案 0 :(得分:6)

查看 libPhoneNumber-iOS 库的NBAsYouTypeFormatter类。

您使用您的美国地区代码创建NSAsYouTypeFormatter的新实例:

NBAsYouTypeFormatter *asYouTypeFormatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:REGION_CODE_STRING];

然后,每当用户更改您拨打的电话号码时:

- (NSString*)inputDigit:(NSString*)nextChar;

- (NSString*)removeLastDigit;

从这两种方法返回的NSString是动态格式化的电话号码。

答案 1 :(得分:6)

我将从头开始解释。因此,新用户可以从一开始就获得成功。

here下载 libPhoneNumber-iOS 库。在该链接页面的底部,您将找到需要添加到项目中的文件。

现在,按照以下步骤实施。

(1)在视图控制器中导入需要格式化文本字段的文件。

#import "NBPhoneMetaDataGenerator.h"
#import "NBPhoneNumberUtil.h"
#import "NBAsYouTypeFormatter.h"

在头文件中创建 NBAsYouTypeFormatter 类型的实例:

NBAsYouTypeFormatter *asYouTypeFormatter;

(2)在该视图控制器的viewDidLoad方法中,初始化之前采用的对象:

asYouTypeFormatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"IN"];

注意:@“IN”适用于印度。您可以将其设置为您想要的任何内容。请参阅将包含在libPhoneNumber-iOS库中的plist文件,以查看区域代码的完整列表。

(3)UITextField的委托方法中,动态管理yout textfield的文本。

#pragma mark
#pragma mark - Phone Number textfield formatting

# define LIMIT 18 // Or whatever you want

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    // Just allow 18 digits
    if(!(([string length] + range.location) > LIMIT))
    {
        // Something entered by user
        if(range.length == 0)
        {
            [txtNumber setText:[asYouTypeFormatter inputDigit:string]];
        }

        // Backspace
        else if(range.length == 1)
        {
            [txtNumber setText:[asYouTypeFormatter removeLastDigit]];
        }
    }

    return NO;
}

希望它有所帮助!!!

答案 2 :(得分:3)

我找到了一个我想分享的解决方案,因为即使使用此前提供的解决方案,我也很难找到如何使其发挥作用。

我有一个tableView,其单元格包含textField。其中一个单元格带有电话号码。在某些情况下,它可能已被填写。

顺便说一下,这是在斯威夫特。

  1. 确保您的桥接头文件 nameOfYourProject-Bridging-Header 包含以下行:

    #import "NBAsYouTypeFormatter.h"
    
  2. 声明NBAsYouTypeFormatter的属性:

    private var phoneFormatter: NBAsYouTypeFormatter!
    
  3. 在viewDidLoad或属性的didSet中,使用国家/地区代码初始化NBAsYouTypeFormatter:

    // yourRegionCode is a 2-digit country code (ISO 3166)
    phoneFormatter = NBAsYouTypeFormatter(regionCode: yourRegionCode)
    
  4. 将viewController声明为TextFieldDelegate并实现函数 shouldChangeCharactersInRange

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    
        // Phone number cell
        if cellContainsPhoneNumber { // This is specific to your own tableView
    
            // Formatting phone number as you type
            let textWithoutSpaces = textField.text.stringByReplacingOccurrencesOfString(" ", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
            phoneFormatter.inputString(textWithoutSpaces) // This is the initial value of the phoneFormatter each time the delegate method is called
    
            let formattedNumber: String!
            if string == "" {
                formattedNumber = phoneFormatter.removeLastDigit()
            } else {
                formattedNumber = phoneFormatter.inputDigit(string)
            }
    
            // set the textField text with the new formattedNumber
            textField.text = formattedNumber
            return false 
        }
        return true
    }
    
  5. 这样,它就像Apple的联系人编辑机制一样。 如果这有助于你,请告诉我。

答案 3 :(得分:3)

这是一个通常适用于我的更新代码段(Swift 2.0):

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    // Allow up to 18 chars
    if !(string.characters.count + range.location > 18) {
        if range.length == 0 {
            // original text didn't change
            textField.text = phoneFormatter?.inputDigit(string)
        } else if range.length == 1 { 
            // user pressed backspace
            textField.text = phoneFormatter?.removeLastDigit()
        } else if range.length == textField.text?.characters.count {
            // text was cleared
            phoneFormatter?.clear()
            textField.text = ""
        }
    }
    return false
}

更改的主要内容是允许用户按“清除”按钮或全选 - >清除。

有一些边缘情况,例如用户编辑电话号码中的特定数字,这些数字无法处理但可以轻松添加。

答案 4 :(得分:1)

这是一个使用 libPhoneNumber 的解决方案,它还可以处理在数字中间进行编辑、剪切和粘贴、选择和键入等重要情况。它使光标保持稳定并且不会出现意外行为。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if(range.location == textField.text.length && range.length == 0)
    {
        // Something added at end
        textField.text = [numberFormatter inputDigit:string];
    }
    else if(range.location == textField.text.length-1 && range.length == 1)
    {
        // Backspace at end
        textField.text = [numberFormatter removeLastDigit];
    } else {
        // Other modification in middle
        NSString* input = textField.text;
        // New cursor position after modification
        NSUInteger cursorIdx = range.location + string.length;
        // If backspacing to delete a format character - just reposition the cursor.
        BOOL backspaceOnly = range.length == 1 && string.length == 0 && !isdigit([input characterAtIndex:range.location]);
        if(!backspaceOnly) {
            // make the modification, reformat the number
            input = [input stringByReplacingCharactersInRange:range withString:string];
            [numberFormatter clear];
            BOOL rememberCursorPos = NO;
            NSString* text;
            // reinput the number to the formatter
            // remembering the first digit position at or after the cursor
            for (int i = 0; i < input.length; ++i)
            {
                if(i == cursorIdx) {
                    rememberCursorPos = YES;
                }
                char digit = [input characterAtIndex:i];
                switch(digit) {
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                        if(!rememberCursorPos) {
                            text = [numberFormatter inputDigit:[NSString stringWithFormat:@"%c", digit]];
                        } else {
                            text = [numberFormatter inputDigitAndRememberPosition:[NSString stringWithFormat:@"%c", digit]];
                            rememberCursorPos = NO;
                        }
                        break;
                }
            }
            // reformat the number
            textField.text = text;
            // get updated cursor position (formatter position starts at 1)
            cursorIdx = numberFormatter.getRememberedPosition - 1;
        }
        // reposition the cursor
        UITextPosition* position = [textField positionFromPosition:textField.beginningOfDocument offset:cursorIdx];
        textField.selectedTextRange = [textField textRangeFromPosition:position toPosition:position];
    }
    return NO;
}

答案 5 :(得分:0)

您可以在输入https://github.com/luximetr/AnyFormatKit

时使用此库格式化输入

实施例

let textInputController = TextInputController()

let textInput = TextInputField() // or TextInputView or any TextInput
textInputController.textInput = textInput // setting textInput

let formatter = TextInputFormatter(textPattern: "### (###) ###-##-##", prefix: "+12")
textInputController.formatter = formatter // setting formatter

在这种情况下,TextInputController将格式化textField或textView中的文本。