проверка правильности десятичного ввода в поле UITextField

#swift #uitextfield

Вопрос:

Один из входных полей UITextField должен принимать десятичные дроби. Но я хочу ограничить пользователя вводом только одного «.», иначе преобразование с плавающей запятой будет испорчено, если в числе будет более одного».». Как убедиться, что пользователь не вводит более одного «.» в качестве части десятичного ввода?

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -gt; Bool {  if ( textField == areaTextField) {  guard CharacterSet(charactersIn: "0123456789.").isSuperset(of: CharacterSet(charactersIn: string)) else {  return false  }  }   return true    }  

Ответ №1:

С самого начала ваш подход неверен; вы слишком много думаете об этом. Компьютер уже знает, является ли строка допустимым числом, поэтому просто спросите его. Не изучайте никаких персонажей. Не проверяйте никаких ключей. Просто выполните замену, описанную в параметрах, и спросите компьютер, будет ли результатом число:

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -gt; Bool {  let rep = (textField.text! as NSString).replacingCharacters(in: range, with: string)  return rep.count == 0 || Double(rep) != nil }  

Комментарии:

1. Попробовал что-то подобное и не сработало для float с десятичными знаками функция isNumber(str : Строка) — gt; Bool { пусть numberCharacters = набор символов.decimalDigits.инвертированный пусть val = !str.пусто amp;amp; str.Диапазон символов(от:numberCharacters) == ноль возвращает значение } при индивидуальном тестировании str.Диапазон символов(от:numberCharacters), где str является десятичным, выдает ошибку: значение типа «Double» не имеет элемента » rangeOfCharacter ‘Как я уже сказал, я хочу передать, если ваши ключи целочисленные или десятичные, но если пользователь случайно вводит более одного десятичного знака, поймайте его, чтобы я мог предупредить пользователя

2. Ну, ты все еще не делаешь то, что я сказал. Ты слишком много об этом думаешь… Чтобы выяснить, является ли общая строка допустимым десятичным числом, просто попробуйте заставить ее удвоиться.