Как форматировать текст UITextField в режиме реального времени, когда он редактируется?

Как изменить значение текста UITextField во время ввода?

Другими словами:

когда я печатаю 1, он должен показать 1

когда я печатаю 10, он должен показать 10

когда я набираю 100, он должен показать 100 но

когда я печатаю 1000, он должен показать 1000

Вы можете дать какие-либо идеи?

Ответ 1

Добавить метод уведомления textFieldDidChange в текстовое поле.

[textField addTarget:self
              action:@selector(textFieldDidChange:)
    forControlEvents:UIControlEventEditingChanged];


-(void)textFieldDidChange:(UITextField *)theTextField
{
    NSLog(@"text changed: %@", theTextField.text);

    NSString *textFieldText = [theTextField.text stringByReplacingOccurrencesOfString:@"," withString:@""];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSString *formattedOutput = [formatter stringFromNumber:[NSNumber numberWithInt:[textFieldText integerValue]]];
    textField.text=formattedOutput;            
}

Ответ 2

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init] ;
    if([string length]==0)
    {
        [formatter setGroupingSeparator:@","];
        [formatter setGroupingSize:4];
        [formatter setUsesGroupingSeparator:YES];
        [formatter setSecondaryGroupingSize:3];
        NSString *num = textField.text ;
        num = [num stringByReplacingOccurrencesOfString:@"," withString:@""];
        NSString *str = [formatter stringFromNumber:[NSNumber numberWithDouble:[num doubleValue]]];
        textField.text = str;
        return YES;
    }
    else {
        [formatter setGroupingSeparator:@","];
        [formatter setGroupingSize:2];
        [formatter setUsesGroupingSeparator:YES];
        [formatter setSecondaryGroupingSize:3];
        NSString *num = textField.text ;
        if(![num isEqualToString:@""])
        {
            num = [num stringByReplacingOccurrencesOfString:@"," withString:@""];
            NSString *str = [formatter stringFromNumber:[NSNumber numberWithDouble:[num doubleValue]]];
            textField.text = str;
            NSLog(@"add:%@",str);
        }
        return YES;
    }
}

P.S. Этот код находится в ARC, позаботится об управлении памятью в не дуговой среде.

Ответ 3

Swift:

Обязательно выберите текстовое поле в качестве цифровой клавиатуры, затем:

В вашем представленииDidLoad:

yourTextField(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)

Затем в том же контроллере представления:

func textFieldDidChange(textField: UITextField) {
        if textField == yourTextField {

            // Some locales use different punctuations.
            var textFormatted = textField.text?.replacingOccurrences(of: ",", with: "")
            textFormatted = textFormatted?.replacingOccurrences(of: ".", with: "")

            let numberFormatter = NumberFormatter()
            numberFormatter.numberStyle = .decimal
            if let text = textFormatted, let textAsInt = Int(text) {
                textField.text = numberFormatter.string(from: NSNumber(value: textAsInt))
            }
        }
    }

Ответ 4

Попробуйте это. Вы можете написать следующую строку в методе ViewDidLoad и предоставить делегату текстовое поле.

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

и напишите следующий метод.

-(void)textFieldDidChange:(UITextField*)textfield{
  NSLog(@"here %@",textfield.text);
  if ([textfield.text isEqualToString:@"1000"]) {
    [email protected]"1,000";
  }
}