Формат UITextField в xx-xx-xxx
Я использую UITextField, и я хочу, чтобы этот символ принимал символ только в формате xx-xx-xxx.
любая помощь?
Ответы
Ответ 1
Попробуйте ниже, он будет работать
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
}
}
Ответ 2
Придется делать это красиво для телефонных номеров с переменным форматом, вот что я написал. Не стесняйтесь повторного использования. Сначала у меня есть метод фильтрации форматированной строки, где # - число, а любой другой символ - это своего рода "наполнитель", который должен быть удобно вставлен после того, как пользователь доберется до того места, где ему нужно.
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];
}
Теперь, чтобы они могли удалить с помощью наполнителя, я изменил значение my, чтобы изменить символы в диапазоне.
- (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;
}
Это обеспечивает действительно чистый способ заставить пользователей вводить числа в определенном формате.
Ответ 3
Реализовать свою логику внутри textField:shouldChangeCharactersInRange:replacementString:
, которая является методом делегата.
Ответ 4
Быстрый тип длинного метода, но отлично работает: 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
Ответ 5
Вот мой взгляд на него, посмотрев на все ответы.
Swift 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: "")
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
}
Ответ 6
Мои поисковые запросы Google говорят мне, что вы должны реализовать
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
из протокола UITextFieldDelegate
.
Посмотрите этот для получения дополнительной информации.
Ответ 7
Если вы хотите, чтобы он был чем-то вроде даты, вы можете создать свой собственный формат даты следующим образом:
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