用于电话号码的UITextField

我想知道如何格式化我用于电话号码的textField(例如iPhone上的“添加新联系人”页面)当我input一个新的手机,例如1236890987时,它将其格式设置为(123 )689-0987)。我已经把键盘设置为数字键盘了。

谢谢!

这是我的解决scheme..伟大的作品! 格式化电话号码实时。 注意:这是10位数字的电话号码。 而目前它自动格式化它像(xxx)xxx-xxxx ..调整到你的心中的喜悦。

首先在你的shouldChangeCharactersInRange你想收集整个string的电话文本字段,并将其传递给validation/格式化function。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString* totalString = [NSString stringWithFormat:@"%@%@",textField.text,string]; // if it's the phone number textfield format it. if(textField.tag==102 ) { if (range.length == 1) { // Delete button was hit.. so tell the method to delete the last char. textField.text = [self formatPhoneNumber:totalString deleteLastChar:YES]; } else { textField.text = [self formatPhoneNumber:totalString deleteLastChar:NO ]; } return false; } return YES; } 

这里是电话号码的格式。 正则expression式可能会被清理一下。 但是我已经testing了一段时间的代码,似乎通过了所有的钟声。 注意我们也使用这个function来删除电话号码中的一个号码。 在这里工作更容易,因为我们已经删除了所有其他的非数字。

  -(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar { if(simpleNumber.length==0) return @""; // use regex to remove non-digits(including spaces) so we are left with just the numbers NSError *error = NULL; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[\\s-\\(\\)]" options:NSRegularExpressionCaseInsensitive error:&error]; simpleNumber = [regex stringByReplacingMatchesInString:simpleNumber options:0 range:NSMakeRange(0, [simpleNumber length]) withTemplate:@""]; // check if the number is to long if(simpleNumber.length>10) { // remove last extra chars. simpleNumber = [simpleNumber substringToIndex:10]; } if(deleteLastChar) { // should we delete the last digit? simpleNumber = [simpleNumber substringToIndex:[simpleNumber length] - 1]; } // 123 456 7890 // format the number.. if it's less then 7 digits.. then use this regex. if(simpleNumber.length<7) simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d+)" withString:@"($1) $2" options:NSRegularExpressionSearch range:NSMakeRange(0, [simpleNumber length])]; else // else do this one.. simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d{3})(\\d+)" withString:@"($1) $2-$3" options:NSRegularExpressionSearch range:NSMakeRange(0, [simpleNumber length])]; return simpleNumber; } 

以下是你如何在Swift中做到这一点:

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if (textField == phoneTextField) { let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) let components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) let decimalString = components.joinWithSeparator("") as NSString let length = decimalString.length let hasLeadingOne = length > 0 && decimalString.characterAtIndex(0) == (1 as unichar) if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 { let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int return (newLength > 10) ? false : true } var index = 0 as Int let formattedString = NSMutableString() if hasLeadingOne { formattedString.appendString("1 ") index += 1 } if (length - index) > 3 { let areaCode = decimalString.substringWithRange(NSMakeRange(index, 3)) formattedString.appendFormat("(%@)", areaCode) index += 3 } if length - index > 3 { let prefix = decimalString.substringWithRange(NSMakeRange(index, 3)) formattedString.appendFormat("%@-", prefix) index += 3 } let remainder = decimalString.substringFromIndex(index) formattedString.appendString(remainder) textField.text = formattedString as String return false } else { return true } } 

我一直在挣扎几个小时,这是我有:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSUInteger currentLength = textField.text.length; NSCharacterSet *numbers = [NSCharacterSet decimalDigitCharacterSet]; if (range.length == 1) { return YES; } if ([numbers characterIsMember:[string characterAtIndex:0]]) { if ( currentLength == 3 ) { if (range.length != 1) { NSString *firstThreeDigits = [textField.text substringWithRange:NSMakeRange(0, 3)]; NSString *updatedText; if ([string isEqualToString:@"-"]) { updatedText = [NSString stringWithFormat:@"%@",firstThreeDigits]; } else { updatedText = [NSString stringWithFormat:@"%@-",firstThreeDigits]; } [textField setText:updatedText]; } } else if ( currentLength > 3 && currentLength < 8 ) { if ( range.length != 1 ) { NSString *firstThree = [textField.text substringWithRange:NSMakeRange(0, 3)]; NSString *dash = [textField.text substringWithRange:NSMakeRange(3, 1)]; NSUInteger newLenght = range.location - 4; NSString *nextDigits = [textField.text substringWithRange:NSMakeRange(4, newLenght)]; NSString *updatedText = [NSString stringWithFormat:@"%@%@%@",firstThree,dash,nextDigits]; [textField setText:updatedText]; } } else if ( currentLength == 8 ) { if ( range.length != 1 ) { NSString *areaCode = [textField.text substringWithRange:NSMakeRange(0, 3)]; NSString *firstThree = [textField.text substringWithRange:NSMakeRange(4, 3)]; NSString *nextDigit = [textField.text substringWithRange:NSMakeRange(7, 1)]; [textField setText:[NSString stringWithFormat:@"(%@) %@-%@",areaCode,firstThree,nextDigit]]; } } } else { return NO; } return YES; } 

我希望有人能贡献。

来自Vikzilla for Swift 3的更新答案:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if textField == phoneTextField { let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string) let components = (newString as NSString).components(separatedBy: NSCharacterSet.decimalDigits.inverted) let decimalString = components.joined(separator: "") as NSString let length = decimalString.length let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar) if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 { let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int return (newLength > 10) ? false : true } var index = 0 as Int let formattedString = NSMutableString() if hasLeadingOne { formattedString.append("1 ") index += 1 } if (length - index) > 3 { let areaCode = decimalString.substring(with: NSMakeRange(index, 3)) formattedString.appendFormat("(%@)", areaCode) index += 3 } if length - index > 3 { let prefix = decimalString.substring(with: NSMakeRange(index, 3)) formattedString.appendFormat("%@-", prefix) index += 3 } let remainder = decimalString.substring(from: index) formattedString.append(remainder) textField.text = formattedString as String return false } else { return true } } 

这是我的看法。 这与苹果在“手机和通讯录”应用程序中的function相近(至less当您的区域设置为美国时,我不确定每个区域的行为是否发生更改)。

我特别感兴趣的是格式化1 (123) 123-1234和支持更长的数字,没有格式。 在其他解决scheme中只检查range.length == 1 (用于删除/退格)的bug也会阻止用户select整个string或其中的一部分并按下删除/退格键,这就解决了这种情况。

当你开始在中间select一个范围并编辑时,会出现一些奇怪的行为,由于设置文本字段的值,光标总是在string的末尾结束。 我不知道如何重新定位UITextField的游标,我认为苹果实际上在联系人和手机应用程序中使用UITextView ,因为它们在执行内联格式时保持光标位置,它们似乎处理所有的细微差别! 我希望他们能把这个开箱即可。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSMutableString *newString = [NSMutableString stringWithString:textField.text]; [newString replaceCharactersInRange:range withString:string]; NSString *phoneNumberString = [self formattedPhoneNumber:newString]; if (range.length >= 1) { // backspace/delete if (phoneNumberString.length > 1) { // the way we format the number it is possible that when the user presses backspace they are not deleting the last number // in the string, so we need to check if the last character is a number, if it isn't we need to delete everything after the // last number in the string unichar lastChar = [phoneNumberString characterAtIndex:phoneNumberString.length-1]; NSCharacterSet *numberCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"1234567890#*"]; if (![numberCharacterSet characterIsMember:lastChar]) { NSRange numberRange = [phoneNumberString rangeOfCharacterFromSet:numberCharacterSet options:NSBackwardsSearch]; phoneNumberString = [phoneNumberString substringToIndex:numberRange.location+1]; } } } textField.text = phoneNumberString; return NO; } - (NSString *)formattedPhoneNumber:(NSString *)string { NSString *formattedPhoneNumber = @""; NSCharacterSet *numberCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"1234567890#*+"]; NSRange pauseRange = [string rangeOfString:@","]; NSRange waitRange = [string rangeOfString:@";"]; NSString *numberStringToFormat = nil; NSString *numberStringToAppend = @""; if (pauseRange.location != NSNotFound || waitRange.location != NSNotFound) { NSString *choppedString = [string substringToIndex:MIN(pauseRange.location, waitRange.location)]; numberStringToFormat = [[choppedString componentsSeparatedByCharactersInSet:[numberCharacterSet invertedSet]] componentsJoinedByString:@""]; numberStringToAppend = [string substringFromIndex:MIN(pauseRange.location, waitRange.location)]; } else { numberStringToFormat = [[string componentsSeparatedByCharactersInSet:[numberCharacterSet invertedSet]] componentsJoinedByString:@""]; } if ([numberStringToFormat hasPrefix:@"0"] || [numberStringToFormat hasPrefix:@"11"]) { // numbers starting with 0 and 11 should not be formatted formattedPhoneNumber = numberStringToFormat; } else if ([numberStringToFormat hasPrefix:@"1"]) { if (numberStringToFormat.length <= 1) { // 1 formattedPhoneNumber = numberStringToFormat; } else if (numberStringToFormat.length <= 4) { // 1 (234) NSString *areaCode = [numberStringToFormat substringFromIndex:1]; if (areaCode.length < 3) { formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@", [numberStringToFormat substringFromIndex:1]]; // 1 (XXX) } else { formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@) ", [numberStringToFormat substringFromIndex:1]]; // 1 (XXX) } } else if (numberStringToFormat.length <= 7) { // 1 (234) 123 formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@) %@", [numberStringToFormat substringWithRange:NSMakeRange(1, 3)], //1 (XXX) 123 [numberStringToFormat substringFromIndex:4]]; // 1 (234) XXX } else if (numberStringToFormat.length <= 11) { // 1 (123) 123-1234 formattedPhoneNumber = [NSString stringWithFormat:@"1 (%@) %@-%@", [numberStringToFormat substringWithRange:NSMakeRange(1, 3)], //1 (XXX) 123 [numberStringToFormat substringWithRange:NSMakeRange(4, 3)], //1 (234) XXX-1234 [numberStringToFormat substringFromIndex:7]]; // 1 (234) 123-XXXX } else { // 1123456789012.... formattedPhoneNumber = numberStringToFormat; } } else { if (numberStringToFormat.length <= 3) { // 123 formattedPhoneNumber = numberStringToFormat; } else if (numberStringToFormat.length <= 7) { // 123-1234 formattedPhoneNumber = [NSString stringWithFormat:@"%@-%@", [numberStringToFormat substringToIndex:3], // XXX-1234 [numberStringToFormat substringFromIndex:3]]; // 123-XXXX } else if (numberStringToFormat.length <= 10) { // (123) 123-1234 formattedPhoneNumber = [NSString stringWithFormat:@"(%@) %@-%@", [numberStringToFormat substringToIndex:3], // (XXX) 123-1234 [numberStringToFormat substringWithRange:NSMakeRange(3, 3)], // (123) XXX-1234 [numberStringToFormat substringFromIndex:6]]; // (123) 123-XXXX } else { // 123456789012.... formattedPhoneNumber = numberStringToFormat; } } if (numberStringToAppend.length > 0) { formattedPhoneNumber = [NSString stringWithFormat:@"%@%@", formattedPhoneNumber, numberStringToAppend]; } return formattedPhoneNumber; } 

这个解决scheme适用于没有国际拨号前缀(+1)的北美电话号码,也没有扩展名。 该号码将被格式化为“(212)555-1234”。 它会预先input“)”和“ – ”,但是也会被正确删除。

这里是你的文本字段委托应该实现的-textField:shouldChangeCharactersInRange:replacementString

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField == self.myPhoneTextField) { NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string]; BOOL deleting = [newText length] < [textField.text length]; NSString *stripppedNumber = [newText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [newText length])]; NSUInteger digits = [stripppedNumber length]; if (digits > 10) stripppedNumber = [stripppedNumber substringToIndex:10]; UITextRange *selectedRange = [textField selectedTextRange]; NSInteger oldLength = [textField.text length]; if (digits == 0) textField.text = @""; else if (digits < 3 || (digits == 3 && deleting)) textField.text = [NSString stringWithFormat:@"(%@", stripppedNumber]; else if (digits < 6 || (digits == 6 && deleting)) textField.text = [NSString stringWithFormat:@"(%@) %@", [stripppedNumber substringToIndex:3], [stripppedNumber substringFromIndex:3]]; else textField.text = [NSString stringWithFormat:@"(%@) %@-%@", [stripppedNumber substringToIndex:3], [stripppedNumber substringWithRange:NSMakeRange(3, 3)], [stripppedNumber substringFromIndex:6]]; UITextPosition *newPosition = [textField positionFromPosition:selectedRange.start offset:[textField.text length] - oldLength]; UITextRange *newRange = [textField textRangeFromPosition:newPosition toPosition:newPosition]; [textField setSelectedTextRange:newRange]; return NO; } return YES; } 

从Vikzilla更新Swift 2.0的答案:

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { sendButton.enabled = true let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) let components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) let decimalString : String = components.joinWithSeparator("") let length = decimalString.characters.count let decimalStr = decimalString as NSString let hasLeadingOne = length > 0 && decimalStr.characterAtIndex(0) == (1 as unichar) if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 { let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int return (newLength > 10) ? false : true } var index = 0 as Int let formattedString = NSMutableString() if hasLeadingOne { formattedString.appendString("1 ") index += 1 } if (length - index) > 3 { let areaCode = decimalStr.substringWithRange(NSMakeRange(index, 3)) formattedString.appendFormat("(%@)", areaCode) index += 3 } if length - index > 3 { let prefix = decimalStr.substringWithRange(NSMakeRange(index, 3)) formattedString.appendFormat("%@-", prefix) index += 3 } let remainder = decimalStr.substringFromIndex(index) formattedString.appendString(remainder) textField.text = formattedString as String return false } 

为我工作excelente,希望它也适用于你:)

以下function在textField上强制执行(999)333-5555格式:

Swift 3:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if (textField == self.phone){ let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string) let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted) let decimalString = components.joined(separator: "") as NSString let length = decimalString.length let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar) if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 { let newLength = (textField.text! as NSString).length + (string as NSString).length - range.length as Int return (newLength > 10) ? false : true } var index = 0 as Int let formattedString = NSMutableString() if hasLeadingOne { formattedString.append("1 ") index += 1 } if (length - index) > 3 { let areaCode = decimalString.substring(with: NSMakeRange(index, 3)) formattedString.appendFormat("(%@)", areaCode) index += 3 } if length - index > 3 { let prefix = decimalString.substring(with: NSMakeRange(index, 3)) formattedString.appendFormat("%@-", prefix) index += 3 } let remainder = decimalString.substring(from: index) formattedString.append(remainder) textField.text = formattedString as String return false } else { return true } } 

我的解决scheme为+ X(XXX)XXX-XXXX格式。 (迅速)

 func textFieldDidBeginEditing(textField: UITextField) { if (textField == self.mobileField) { textField.text = "+" } } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if (textField == self.mobileField) { let newString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) if (newString.characters.count < textField.text?.characters.count && newString.characters.count >= 1) { return true // return true for backspace to work } else if (newString.characters.count < 1) { return false; // deleting "+" makes no sence } if (newString.characters.count > 17 ) { return false; } let components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) let decimalString = components.joinWithSeparator("") as NSString let length = decimalString.length var index = 0 let formattedString = NSMutableString() formattedString.appendString("+") if (length >= 1) { let countryCode = decimalString.substringWithRange(NSMakeRange(0, 1)) formattedString.appendString(countryCode) index += 1 } if (length > 1) { var rangeLength = 3 if (length < 4) { rangeLength = length - 1 } let operatorCode = decimalString.substringWithRange(NSMakeRange(1, rangeLength)) formattedString.appendFormat(" (%@) ", operatorCode) index += operatorCode.characters.count } if (length > 4) { var rangeLength = 3 if (length < 7) { rangeLength = length - 4 } let prefix = decimalString.substringWithRange(NSMakeRange(4, rangeLength)) formattedString.appendFormat("%@-", prefix) index += prefix.characters.count } if (index < length) { let remainder = decimalString.substringFromIndex(index) formattedString.appendString(remainder) } textField.text = formattedString as String if (newString.characters.count == 17) { textField.resignFirstResponder() } return false } return true } 

不幸的是,你必须自己做。 联系人应用使用未logging的API。 出于某种原因,将input格式化程序附加到文本字段不会像在Mac上那样在iPhone上公开。 随意提交function增强错误报告。

希望,我要说的是,对于iOS上的新人来说,这将是有帮助的。 我做了什么zingle-dinglebuild议(非常感谢!)。 为了帮助新的代码加上我会列出可以帮助你。 1.你必须在头文件中添加UITextFieldDelegate。 2. UITextField应该绑定委托与视图,在我的情况下UIViewController,这是头文件。 3.在“.m”文件中,UITextField应该是instatiated,即yourtextfile.delegate = self。

这里是我从英国方面略微本地化的Swift 2代码。

它将格式化为:

+11234567890 as +1(123)456 7890

+33123456789 as +33 1 23 45 67 89

+441234123456 as +44 1234 123456(这已被进一步本地化为01234 123456),因为我不需要看英国国家代码。

请拨打以下电话:

 initInternationalPhoneFormats() //this just needs to be done once var formattedNo = formatInternationalPhoneNo("+11234567890") 

如果您有任何其他国家的代码和格式或代码的改进,请让我知道。

请享用。

 import Cocoa extension String { //extension from http://stackoverflow.com/questions/24092884/get-nth-character-of-a-string-in-swift-programming-language subscript (i: Int) -> Character { return self[self.startIndex.advancedBy(i)] } } var phoneNoFormat = [String : String]() var localCountryCode: String? = "+44" func initInternationalPhoneFormats() { if phoneNoFormat.count == 0 { phoneNoFormat["0"] = "+44 #### ######" //local no (UK) phoneNoFormat["02"] = "+44 ## #### #####" //local no (UK) London phoneNoFormat["+1"] = "+# (###) ###-####" //US and Canada phoneNoFormat["+234"] = "+## # ### ####" //Nigeria phoneNoFormat["+2348"] = "+## ### ### ####" //Nigeria Mobile phoneNoFormat["+31"] = "+## ### ## ## ##" //Netherlands phoneNoFormat["+316"] = "+## # ## ## ## ##" //Netherlands Mobile phoneNoFormat["+33"] = "+## # ## ## ## ##" //France phoneNoFormat["+39"] = "+## ## ########" //Italy phoneNoFormat["+392"] = "+## #### #####" //Italy phoneNoFormat["+393"] = "+## ### #######" //Italy phoneNoFormat["+44"] = "+## #### ######" //United Kingdom phoneNoFormat["+442"] = "+## ## #### #####" //United Kingdom London phoneNoFormat["+51"] = "+## # ### ####" //Peru phoneNoFormat["+519"] = "+## ### ### ###" //Peru Mobile phoneNoFormat["+54"] = "+## ### ### ####" //Argentina phoneNoFormat["+541"] = "+## ## #### ####" //Argentina phoneNoFormat["+549"] = "+## # ### ### ####" //Argentina phoneNoFormat["+55"] = "+## (##) ####-####" //Brazil phoneNoFormat["+551"] = "+## (##) ####-###" //Brazil Mobile? phoneNoFormat["+60"] = "+## # #### ####" //Malaysia phoneNoFormat["+6012"] = "+## ## ### ####" //Malaysia Mobile phoneNoFormat["+607"] = "+## # ### ####" //Malaysia? phoneNoFormat["+61"] = "+## # #### ####" //Australia phoneNoFormat["+614"] = "+## ### ### ###" //Australia Mobile phoneNoFormat["+62"] = "+## ## #######" //Indonesia phoneNoFormat["+628"] = "+## ### ######" //Indonesia Mobile phoneNoFormat["+65"] = "+## #### ####" //Singapore phoneNoFormat["+90"] = "+## (###) ### ## ##" //Turkey } } func getDiallingCode(phoneNo: String) -> String { var countryCode = phoneNo while countryCode.characters.count > 0 && phoneNoFormat[countryCode] == nil { countryCode = String(countryCode.characters.dropLast()) } if countryCode == "0" { return localCountryCode! } return countryCode } func formatInternationalPhoneNo(fullPhoneNo: String, localisePhoneNo: Bool = true) -> String { if fullPhoneNo == "" { return "" } initInternationalPhoneFormats() let diallingCode = getDiallingCode(fullPhoneNo) let localPhoneNo = fullPhoneNo.stringByReplacingOccurrencesOfString(diallingCode, withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil) var filteredPhoneNo = (localPhoneNo.characters.filter{["0","1","2","3","4","5","6","7","8","9"].contains($0)}) if filteredPhoneNo[0] == "0" { filteredPhoneNo.removeFirst() } let phoneNo:String = diallingCode + String(filteredPhoneNo) if let format = phoneNoFormat[diallingCode] { let formatLength = format.characters.count var formattedPhoneNo = [Character]() var formatPos = 0 for char in phoneNo.characters { while formatPos < formatLength && format[formatPos] != "#" && format[formatPos] != "+" { formattedPhoneNo.append(format[formatPos]) formatPos++ } if formatPos < formatLength { formattedPhoneNo.append(char) formatPos++ } else { break } } if localisePhoneNo, let localCode = localCountryCode { return String(formattedPhoneNo).stringByReplacingOccurrencesOfString(localCode + " ", withString: "0", options: NSStringCompareOptions.LiteralSearch, range: nil) //US users need to remove the extra 0 } return String(formattedPhoneNo) } return String(filteredPhoneNo) } 

您可以添加电话号码,如000-000-0000(10位)。 请参阅此代码。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField==Phone_TXT) { if (range.location == 12) { return NO; } // Backspace if ([string length] == 0) return YES; if ((range.location == 3) || (range.location == 7)) { NSString *str = [NSString stringWithFormat:@"%@-",textField.text]; textField.text = str; } return YES; } } 

https://github.com/chebur/CHRTextFieldFormatter对我来说就像一个魅力。;

从使用页面复制/粘贴:

 - (void)viewDidLoad { [super viewDidLoad]; self.phoneNumberFormatter = [[CHRTextFieldFormatter alloc] initWithTextField:self.phoneNumberTextField mask:[CHRPhoneNumberMask new]]; self.cardNumberFormatter = [[CHRTextFieldFormatter alloc] initWithTextField:self.cardNumberTextField mask:[CHRCardNumberMask new]]; } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField == self.phoneNumberTextField) { return [self.phoneNumberFormatter textField:textField shouldChangeCharactersInRange:range replacementString:string]; } else if (textField == self.cardNumberTextField) { return [self.cardNumberFormatter textField:textField shouldChangeCharactersInRange:range replacementString:string]; } else { return YES; } } 

又快:

 override func viewDidLoad() { super.viewDidLoad() self.phoneNumber.delegate = self self.phoneNumberFormatter = CHRTextFieldFormatter(textField: self.phoneNumber, mask:CHRPhoneNumberMask()) } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if textField == self.phoneNumber { return self.phoneNumberFormatter.textField(textField, shouldChangeCharactersInRange: range, replacementString: string) } return true } 

Swift 3的 “iOS单元”更新答案,格式为+ X(XXX)XXX-XXXX:

 func textFieldDidBeginEditing(_ textField: UITextField) { if (textField == self.phoneTextField) { textField.text = "+" } } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if (textField == self.phoneTextField) { let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string) if (newString.characters.count < (textField.text?.characters.count)! && newString.characters.count >= 1) { return true // return true for backspace to work } else if (newString.characters.count < 1) { return false; // deleting "+" makes no sence } if (newString.characters.count > 17 ) { return false; } let components = newString.components(separatedBy: CharacterSet.decimalDigits.inverted) let decimalString = components.joined(separator: "") as NSString let length = decimalString.length var index = 0 let formattedString = NSMutableString() formattedString.append("+") if (length >= 1) { let countryCode = decimalString.substring(with: NSMakeRange(0, 1)) formattedString.append(countryCode) index += 1 } if (length > 1) { var rangeLength = 3 if (length < 4) { rangeLength = length - 1 } let operatorCode = decimalString.substring(with: NSMakeRange(1, rangeLength)) formattedString.appendFormat(" (%@) ", operatorCode) index += operatorCode.characters.count } if (length > 4) { var rangeLength = 3 if (length < 7) { rangeLength = length - 4 } let prefix = decimalString.substring(with: NSMakeRange(4, rangeLength)) formattedString.appendFormat("%@-", prefix) index += prefix.characters.count } if (index < length) { let remainder = decimalString.substring(from: index) formattedString.append(remainder) } textField.text = formattedString as String if (newString.characters.count == 17) { textField.resignFirstResponder() } return false } return true } 

你必须这样做手动。 接收textField的通知,并检查字段文本的长度,并根据国家进行格式化。 如果有任何问题让我知道。 我已经这样做了

我有一个解决scheme,但它有一些缺点,看看你是否可以修改和使用它。 通过使用此function,您可以将电话号码限制为10位,并按照美国的格式进行格式化。

 #define MAX_LENGTH 10 

在UITextField委托方法中实现它

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSInteger insertDelta = string.length - range.length; if (PhoneNumber_txt.text.length + insertDelta > MAX_LENGTH) { return NO; // the new string would be longer than MAX_LENGTH } else { range.length = 3; range.location = 3; PhoneNumber_txt.text = [NSString stringWithFormat:@"(%@)%@-%@", [PhoneNumber_txt.text substringToIndex:3], [PhoneNumber_txt.text substringWithRange:range], [PhoneNumber_txt.text substringFromIndex:6]]; return YES; } } 
 - (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSCharacterSet* validationSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; NSArray* components = [string componentsSeparatedByCharactersInSet:validationSet]; if ([components count] > 1) { return NO; } NSString* newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; NSArray* validComponents = [newString componentsSeparatedByCharactersInSet:validationSet]; static const int localNumberMaxLength = 7; static const int areaCodeMaxLength = 3; static const int countryCodeMaxLength = 2; newString = [validComponents componentsJoinedByString:@""]; if ([newString length] > localNumberMaxLength + areaCodeMaxLength + countryCodeMaxLength) { return NO; } NSLog(@"new string: %@", newString); NSMutableString* resultString = [NSMutableString string]; NSInteger localNumberLength = MIN([newString length], localNumberMaxLength); if (localNumberLength > 0) { NSString* number = [newString substringFromIndex:(int)[newString length] - localNumberLength]; [resultString appendString:number]; if ([resultString length] > 3) { [resultString insertString:@"-" atIndex:3]; } } if ([newString length] > localNumberMaxLength) { NSInteger areaCodeLength = MIN((int)[newString length] - localNumberMaxLength, areaCodeMaxLength); NSRange areaRange = NSMakeRange((int)[newString length] - localNumberMaxLength - areaCodeLength, areaCodeLength); NSString* area = [newString substringWithRange:areaRange]; area = [NSString stringWithFormat:@"(%@) ",area]; [resultString insertString:area atIndex:0]; } if ([newString length] > localNumberMaxLength + areaCodeMaxLength) { NSInteger countryCodeLength = MIN((int)[newString length] - localNumberMaxLength - areaCodeMaxLength, countryCodeMaxLength); NSRange countryCodeRange = NSMakeRange(0, countryCodeLength); NSString* countryCode = [newString substringWithRange:countryCodeRange]; countryCode = [NSString stringWithFormat:@"+%@ ",countryCode]; [resultString insertString:countryCode atIndex:0]; } textField.text = resultString; return NO; 

}

Here is my solution for 05xx xxx xxxx phone format. At the beginning I set

 phoneTextField.delegate = self phoneTextField.text = "05" // I don't let user to change it. 

It also covers copy/paste cases for cursor position.

Maybe it helps someone for different formats.

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if range.location == 0 || range.location == 1 { return false } var phone = (textField.text! as NSString).replacingCharacters(in: range, with: string) if phone.length > 13 { return false } phone = phone.replacingOccurrences(of: " ", with: "") if phone.characters.count > 7 { phone.insert(" ", at: phone.index(phone.startIndex, offsetBy: 4)) phone.insert(" ", at: phone.index(phone.startIndex, offsetBy: 8)) } else if phone.characters.count > 4 { phone.insert(" ", at: phone.index(phone.startIndex, offsetBy: 4)) } let text = textField.text let stringToStart = text?.substring(to: (text?.index((text?.startIndex)!, offsetBy: range.location))!) let stringToStartCount = ((stringToStart?.components(separatedBy: " ").count)! > 1) ? (stringToStart?.components(separatedBy: " ").count)!-1 : 0 var cursorIndex = range.location + string.length - stringToStartCount if cursorIndex > 7 { cursorIndex += 2 } else if cursorIndex > 4 { cursorIndex += 1 } textField.text = phone textField.selectedTextRange = textField.textRange(from: textField.position(from: textField.beginningOfDocument, offset: cursorIndex)!, to: textField.position(from: textField.beginningOfDocument, offset: cursorIndex)!) return false } 

You can use this library 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 

Just set your textField to this textInputController and it will format text with pattern, that you set.

要么

 let phoneFormatter = TextFormatter(textPattern: "### (###) ###-##-##") phoneFormatter.formattedText(from: "+123456789012") // +12 (345) 678-90-12 

for format full string

objective c solution for +X (XXX) XXX-XXXX format (Converted swift code of Sergey Balashov)

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField == objCell.txtPhone) { NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; if (newString.length < ([textField.text length]) && newString.length >= 1) { return true; } else if (newString.length < 1) { return false; } if (newString.length > 15 ) { return false; } NSArray *components =[newString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]; NSString *decimalString = [components componentsJoinedByString:@""]; NSUInteger length = decimalString.length; NSUInteger index = 0; NSMutableString *formattedString=[[NSMutableString alloc] init]; [formattedString appendString:@"+"]; if (length >= 1) { NSString *countryCode = [decimalString substringWithRange:NSMakeRange(0,1)]; [formattedString appendString:countryCode]; index += 1; } if (length > 1) { NSUInteger rangeLength = 3; if (length < 4) { rangeLength = length - 1; } NSString *operatorCode = [decimalString substringWithRange:NSMakeRange(1, rangeLength)]; [formattedString appendFormat:@"(%@)",operatorCode]; index += operatorCode.length; } if (length > 4) { NSUInteger rangeLength = 3; if (length < 7) { rangeLength = length - 4; } NSString *prefix = [decimalString substringWithRange:NSMakeRange(4, rangeLength)]; [formattedString appendFormat:@"%@-",prefix]; index += prefix.length; } if (index < length) { NSString *remainder = [decimalString substringFromIndex:index]; [formattedString appendString:remainder]; } textField.text = formattedString; if (newString.length == 15) { [textField resignFirstResponder]; } contactNumberAdded=decimalString; return false; } return YES; }