Я не вижу, почему фильтрация IP-адреса должна быть непомерно дорогой. С IIS можно создать фильтр ISAPI, чтобы сделать это в собственном коде. Я уверен, что у апача есть подобные интерфейсы. Используя IP-адрес клиента, можно записать простой ограничитель уровня для Запросов HTTP, который не зависит от списка запрещенных товаров или другой такой ерунды.
Я использую этот код в своем приложении для 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]];
}
}
Вы можете использовать doubleValue своей строки, например
NSString *string=@"1.22";
double a=[string doubleValue];
, я думаю, это вернет значение 0.0, если строка недействительна (это может вызвать исключение, и в этом случае вы можете просто поймать его , в документации указано 0,0 tho). подробнее здесь
Есть несколько способов сделать это:
nil
, если не может. IMO с использованием чего-то вроде - [NSString doubleValue]
не будет лучшим вариантом, потому что и @ "0.0"
, и @ "abc"
будет иметь значение doubleValue, равное 0. Все методы * value возвращают 0, если они не могут правильно преобразовать строку, поэтому было бы трудно отличить допустимую строку @ "0"
от недопустимой строки. Что-то вроде функции C strtol
будет иметь ту же проблему.
Я думаю, что использование NSNumberFormatter было бы лучшим вариантом, поскольку он учитывает языковой стандарт (например, число @ "1,23"
в Европе по сравнению с @ "1,23"
в США).
Если вы хотите, чтобы пользователю было разрешено вводить только числа, вы можете сделать так, чтобы ваш 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: или аналогичный.