在xx-xx-xxx中的UITextField格式

我正在使用UITextField,我想这应该采取字符格式的xx-xx-xxx唯一的数字。

任何帮助?

尝试下面,将工作

Objective-C的

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { int groupingSize = 2; if([string length] == 0) { groupingSize = 4; } NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init] ; NSString *separator = @"-"; [formatter setGroupingSeparator:separator]; [formatter setGroupingSize:groupingSize]; [formatter setUsesGroupingSeparator:YES]; [formatter setSecondaryGroupingSize:2]; if (![string isEqual: @""] && (textField.text != nil && textField.text.length > 0)) { NSString *num = textField.text; num = [num stringByReplacingOccurrencesOfString:separator withString:@""]; NSString *str = [formatter stringFromNumber:[NSNumber numberWithDouble:[num doubleValue]]]; textField.text = str; } return YES; } 

斯威夫特-3

 extension ViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { var groupSize = 2 let separator = "-" if string.characters.count == 0 { groupSize = 4 } let formatter = NumberFormatter() formatter.groupingSeparator = separator formatter.groupingSize = groupSize formatter.usesGroupingSeparator = true formatter.secondaryGroupingSize = 2 if var number = textField.text, string != "" { number = number.replacingOccurrences(of: separator, with: "") if let doubleVal = Double(number) { let requiredString = formatter.string(from: NSNumber.init(value: doubleVal)) textField.text = requiredString } } return true } } 

有一个需要做这个很好的电话号码与variables格式,这是我写的。 随意重用 – 首先,我有一种方法来过滤一个格式化的string,#是一个数字,其他任何字符都是某种“填充”,应该在用户到达需要的地方后方便地插入。

 NSMutableString *filteredPhoneStringFromStringWithFilter(NSString *string, NSString *filter) { NSUInteger onOriginal = 0, onFilter = 0, onOutput = 0; char outputString[([filter length])]; BOOL done = NO; while(onFilter < [filter length] && !done) { char filterChar = [filter characterAtIndex:onFilter]; char originalChar = onOriginal >= string.length ? '\0' : [string characterAtIndex:onOriginal]; switch (filterChar) { case '#': if(originalChar=='\0') { // We have no more input numbers for the filter. We're done. done = YES; break; } if(isdigit(originalChar)) { outputString[onOutput] = originalChar; onOriginal++; onFilter++; onOutput++; } else { onOriginal++; } break; default: // Any other character will automatically be inserted for the user as they type (spaces, - etc..) or deleted as they delete if there are more numbers to come. outputString[onOutput] = filterChar; onOutput++; onFilter++; if(originalChar == filterChar) onOriginal++; break; } } outputString[onOutput] = '\0'; // Cap the output string return [NSString stringWithUTF8String:outputString]; } 

现在,他们可以通过填充删除,我修改了我应该改变范围内的字符。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *filter = @"(###) ### - ####"; if(!filter) return YES; // No filter provided, allow anything NSString *changedString = [textField.text stringByReplacingCharactersInRange:range withString:string]; if(range.length == 1 && // Only do for single deletes string.length < range.length && [[textField.text substringWithRange:range] rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"0123456789"]].location == NSNotFound) { // Something was deleted. Delete past the previous number NSInteger location = changedString.length-1; if(location > 0) { for(; location > 0; location--) { if(isdigit([changedString characterAtIndex:location])) { break; } } changedString = [changedString substringToIndex:location]; } } textField.text = filteredPhoneStringFromStringWithFilter(changedString, filter); return NO; } 

这提供了一个非常干净的方式来强制用户input特定格式的数字。

textField:shouldChangeCharactersInRange:replacementString:实现你的逻辑textField:shouldChangeCharactersInRange:replacementString:这是一个委托方法。

Swifttypes的长方法,但工作正常:iOS 8

ViewController //编程标记—– —– —- —– —– —- —– —– —- —-

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) self.tfCardNumber.addTarget(self, action: "creditCardNumberFormatter:", forControlEvents: .EditingChanged) self.tfExpiryValue.addTarget(self, action: "creditCardExpiryFormatter:", forControlEvents: .EditingChanged) }// end viewDidAppear func creditCardNumberFormatter(sender: AnyObject!) { // create object universally access global methods var objMethodInc = MethodInc(object: self) var formattedText = objMethodInc.formatCreditCard(self.tfCardNumber.text) if formattedText != self.tfCardNumber.text { self.tfCardNumber.text = formattedText } if countElements(self.tfCardNumber.text) == 19 { self.tfCardNumber.resignFirstResponder() self.tfExpiryValue.becomeFirstResponder() } }// end creditCardNumberFormatter func creditCardExpiryFormatter(sender: AnyObject!) { // create object universally access global methods var objMethodInc = MethodInc(object: self) var formattedText = objMethodInc.formatCreditCardExpiry(self.tfExpiryValue.text) if formattedText != self.tfExpiryValue.text { self.tfExpiryValue.text = formattedText } }// end creditCardExpiryFormatter 

// prgm mark — —- — —-

 // delegate for textfield func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange , replacementString string: String) -> Bool { if string == "" { return true } if textField == self.tfCardNumber { if countElements(self.tfCardNumber.text) > 18 { return false } else if textField == self.tfExpiryValue { if countElements(self.tfExpiryValue.text) > 4 { return false } } } return true }// end textField 

———–内部你的命令方法或文件——–

// prgm mark —-

 func formatCreditCard(input: NSString) -> String { var input = self.trimSpecialCharacters(input); println("formatCreditCard input \(input)") var output : NSString? switch (input.length) { case 1: output = input case 2: output = input case 3: output = input case 4: var vs = input.substringToIndex(input.length) output = NSString(string: "\(vs)") break case 5: output = input case 6: output = input case 7: output = input case 8: var vs1 = input.substringToIndex(4) var vs2 = input.substringFromIndex(4) output = NSString(string: "\(vs1)-\(vs2)") break case 9: output = input case 10: output = input case 11: output = input case 12: var vs1 = input.substringToIndex(4) var vs2 = input.substringWithRange(NSMakeRange(4, 4)) var vs3 = input.substringFromIndex(8) output = NSString(string: "\(vs1)-\(vs2)-\(vs3)") break case 13: output = input case 14: output = input case 15: output = input case 16: var vs1 = input.substringToIndex(4) var vs2 = input.substringWithRange(NSMakeRange(4, 4)) var vs3 = input.substringWithRange(NSMakeRange(8, 4)) var vs4 = input.substringFromIndex(12) output = NSString(string: "\(vs1)-\(vs2)-\(vs3)-\(vs4)") break default: output = input break }// end switch println("formatCreditCard out \(output!)") return output! }// end formatCreditCard // prgm mark ---- func formatCreditCardExpiry(input: NSString) -> String { var output : NSString? var input = self.trimSpecialCharacters(input); switch (input.length) { case 1: output = input case 2: var vs = input.substringToIndex(input.length) output = NSString(string: "\(vs)") break case 3: output = input case 4: var vs1 = input.substringToIndex(2) var vs2 = input.substringFromIndex(2) output = NSString(string: "\(vs1)/\(vs2)") break default: output = input break } return output! }// end formatCreditCardExpiry func trimSpecialCharacters(input: NSString) -> NSString { var special = NSCharacterSet(charactersInString: "/+-() ") var comp = input.componentsSeparatedByCharactersInSet(special) as NSArray return comp.componentsJoinedByString("") }//end trimSpecialCharacters 

这是我看完每个人的答案后的承担。

斯威夫特4

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let separator = "-" let filler = "X" if var number = textField.text, string != "" { number = number.replacingOccurrences(of: separator, with: "") number = number.replacingOccurrences(of: filler, with: "") print(number.count) if number.count == 10 { return false } number += string while number.count < 10 { number += "X" } number.insert("-", at: number.index(number.startIndex, offsetBy: 6)) number.insert("-", at: number.index(number.startIndex, offsetBy: 3)) textField.text = number } return false } 

我的谷歌search告诉我,你应该实施

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

UITextFieldDelegate协议。

看看这个更多的信息。

如果你想要它像date那么你可以使自己的date格式化程序像这样:

 NSDateFormatter *formatter; NSString *dateString; formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"dd-MM-yyyy HH:mm"]; //or something in your own style dateString = [formatter stringFromDate:[NSDate date]]; [formatter release]; // maybe; you might want to keep the formatter // if you're doing this a lot. 

在目标c中以自定义格式获取string中的当前时间