Проверьте, что вход к UITextField является числовым только

Я не вижу, почему фильтрация IP-адреса должна быть непомерно дорогой. С IIS можно создать фильтр ISAPI, чтобы сделать это в собственном коде. Я уверен, что у апача есть подобные интерфейсы. Используя IP-адрес клиента, можно записать простой ограничитель уровня для Запросов HTTP, который не зависит от списка запрещенных товаров или другой такой ерунды.

82
задан Josh Caswell 13 November 2014 в 20:58
поделиться

4 ответа

Я использую этот код в своем приложении для Mac, он же или аналогичный должен работать с iPhone. Он основан на регулярных выражениях RegexKitLite и окрашивает текст в красный цвет, если он недействителен.

static bool TextIsValidValue( NSString* newText, double &value )
{
    bool result = false;

    if ( [newText isMatchedByRegex:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"] ) {
        result = true;
        value = [newText doubleValue];
    }
    return result;
}

- (IBAction) doTextChanged:(id)sender;
{
    double value;
    if ( TextIsValidValue( [i_pause stringValue], value ) ) {
        [i_pause setTextColor:[NSColor blackColor]];
        // do something with the value
    } else {
        [i_pause setTextColor:[NSColor redColor]];
    }
}
34
ответ дан 24 November 2019 в 09:01
поделиться

Вы можете использовать doubleValue своей строки, например

NSString *string=@"1.22";
double a=[string doubleValue];

, я думаю, это вернет значение 0.0, если строка недействительна (это может вызвать исключение, и в этом случае вы можете просто поймать его , в документации указано 0,0 tho). подробнее здесь

3
ответ дан 24 November 2019 в 09:01
поделиться

Есть несколько способов сделать это:

  1. Используйте метод NSNumberFormatter numberFromString :. Это вернет NSNumber, если он может правильно проанализировать строку, или nil , если не может.
  2. Используйте NSScanner
  3. Удалите все нечисловые символы и посмотрите, соответствует ли строка
  4. Используйте регулярное выражение

IMO с использованием чего-то вроде - [NSString doubleValue] не будет лучшим вариантом, потому что и @ "0.0" , и @ "abc" будет иметь значение doubleValue, равное 0. Все методы * value возвращают 0, если они не могут правильно преобразовать строку, поэтому было бы трудно отличить допустимую строку @ "0" от недопустимой строки. Что-то вроде функции C strtol будет иметь ту же проблему.

Я думаю, что использование NSNumberFormatter было бы лучшим вариантом, поскольку он учитывает языковой стандарт (например, число @ "1,23" в Европе по сравнению с @ "1,23" в США).

72
ответ дан 24 November 2019 в 09:01
поделиться

Если вы хотите, чтобы пользователю было разрешено вводить только числа, вы можете сделать так, чтобы ваш ViewController реализовал часть UITextFieldDelegate и определил этот метод:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string];

  // The user deleting all input is perfectly acceptable.
  if ([resultingString length] == 0) {
    return true;
  }

  NSInteger holder;

  NSScanner *scan = [NSScanner scannerWithString: resultingString];

  return [scan scanInteger: &holder] && [scan isAtEnd];
}

Вероятно, есть более эффективные способы, но я считаю это довольно удобный способ. И этот метод должен быть легко адаптирован для проверки двойников или чего-то еще: просто используйте scanDouble: или аналогичный.

19
ответ дан 24 November 2019 в 09:01
поделиться