Nano Hash - криптовалюты, майнинг, программирование

добавить префикс к UITextField

Я хочу добавить префикс текста UITextfield. Длина текста UITextfield меньше 7. Сколько символов меньше 7, то все заменить нулями.

Если текст «1234», добавьте префикс, например «0001234». Если текст «12345», добавьте префикс, например «0012345». Если текст «123», добавьте префикс, например «0000123».

может ли кто-нибудь предложить мне, как реализовать.


  • Звучит неприятно в использовании; Если я ввожу 1, а вы устанавливаете 0000001, то нет места для ввода 12 и т. д. Как это будет работать? Почему важно, чтобы в текстовом поле существовали начальные нули? 08.07.2015
  • Единственное, что я знаю для этого, — это приложение-калькулятор. Даже в этом случае начальные нули на самом деле не нужны. Мне не нравится этот вопрос, потому что он просто запрашивает у людей код, а не показывает, что вы пытались создать собственное решение. Это не то, как работает переполнение стека. Все это работает не так. 08.07.2015
  • @Droppy, хотя вы правильно определили проблему, ее можно легко решить с помощью shouldChangeCharacters (и различных других средств) (и нам все равно пришлось бы реализовать этот метод, чтобы пользователь не мог вводить более 7 символов и т. д.). 08.07.2015
  • @nhgrif Ну, вы говорите легко, и все же никто еще не решил это своими ответами ... 08.07.2015
  • @Droppy Мой ответ должен решить эту проблему сейчас. 08.07.2015

Ответы:


1

Похоже, что на самом деле нам нужна строка, состоящая только из цифр, которая всегда имеет длину 7 символов, с крайними левыми символами, заполненными нулями для всего, что пользователь не ввел, верно?

Итак, нам нужно несколько методов, чтобы сделать это как можно проще.

Во-первых, это не имеет смысла прямо сейчас, но нам нужен метод для удаления нулей, которые мы добавили в начале (это будет иметь смысл позже).

Итак, заимствование из этого ответа на переполнение стека...

- (NSString *)stringByRemovingPaddedZeros:(NSString *)string {
    NSRange range = [string rangeOfString:@"^0*" options:NSRegularExpressionSearch];
    return [string stringByReplacingCharactersInRange:range withString:@""];
}

И мы возьмем ответ Илеша для добавления заполненных нулей:

- (NSString *)stringByAddingPaddedZeros:(NSString *)string padLength:(NSInteger)length {
    NSString *padding = [@"" stringByPaddingToLength:(length - string.length) withString:@"0" startingAtIndex:0];
    return [NSString stringWithFormat:@"%@%@", padding, string];
}

Итак, теперь мы можем переключаться между заполненными и незаполненными строками, верно?

Итак, теперь последний шаг, реализация shouldChangeCharactersInRange:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    newString = [self stringByRemovingPaddedZeros:newString];
    newString = [self stringByAddedPaddedZeros:newString padLength:7];
    textField.text = [newString subStringToIndex:7];

    return NO;
}

Здесь мы всегда возвращаем NO, так как устанавливаем свойство textField.text вручную. Теперь, когда есть 7 символов (и нет начальных нулей), пользователь не может вводить больше. Если имеется 7 символов и пользователь нажимает клавишу Backspace, все они должны сдвинуться вправо на единицу и добавить ноль к началу. Если впереди есть начальные нули, вводимые символы должны сдвигать все влево и отбрасывать начальные нули, а также добавлять новый символ впереди.

В качестве дополнительного примечания, этот код не проверяет, что пользователь вводит только цифры. Для этого потребуется дополнительная логика. Я бы просто рекомендовал проверить, что replaceString (string) состоит только из цифр, прежде чем переходить к любому другому коду в shouldChangeCharactersInRange здесь.

08.07.2015
  • Очень хорошо. Вы мечта ленивого программиста ;-) 08.07.2015
  • @Droppy, если бы это не был необычайно распространенный шаблон проектирования для маскировки текстовых полей, у меня были бы другие мысли о таком полном ответе. 08.07.2015

  • 2

    Здесь печатается текст текстового поля при нажатии кнопки. Проверьте код внутри метода.

    - (IBAction)logTextFieldText:(id)sender
    {
    
       NSMutableString *str=[[NSMutableString alloc]init];
    
       if (_txtf.text.length<7)
       {
    
          for (int i=0;i<7-_txtf.text.length; i++)
          {
             [str appendString:@"0"];
          }
          [str appendString:_txtf.text];
       }
    
       NSLog(@"final text is: %@",str);
    
    }
    
    08.07.2015

    3

    Реализуйте метод UITextFieldDelegate textFieldDidEndEditing: для добавления нулей.

    - (void)textFieldDidEndEditing:(nonnull UITextField *)textField
    {
        if (textField.text.length < 7) {
            // Create a string of 0's to pad with
            NSString *padding = [@"" stringByPaddingToLength:(7 - textField.text.length) withString:@"0" startingAtIndex:0];
            NSMutableString *change = [textField.text mutableCopy];
            // Insert the 0's string
            [change insertString:padding atIndex:0];
            textField.text = change;
        }
    }
    
    08.07.2015

    4

    Если вы хотите исправить length текста UITextField, используйте этот метод UITextField delegate.

     - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        if (self.txtGet.text.length>=7) {
            return NO;
        }
        return YES;
    }
    

    и завершение редактирования (или кнопка «Готово»), в которую вы добавляете эту строку перед использованием значения UITextField.

     NSString *padding = [@"" stringByPaddingToLength:(7 - self.txtGet.text.length) withString:@"0" startingAtIndex:0];
        NSMutableString *change = [self.txtGet.text mutableCopy];
        // Insert the 0's string
        [change insertString:padding atIndex:0];
        self.txtGet.text = change;
    

    Я думаю, это полезно для вас. Спасибо.

    08.07.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..