Более изящное решение, оказывается, также является самым простым.
Вам не нужен десятичный ключ разделителя
Почему? Поскольку можно просто вывести его из входа пользователя. Например, в американской локали, когда Вы, что войти в 1,23$, Вы запускаете путем ввода номеров 1-2-3 (в том порядке). В системе, поскольку каждый символ вводится, это было бы распознано как:
Уведомление, как мы вывели десятичный разделитель на основе входа пользователя. Теперь, если бы пользователь хочет войти в 1,00$, они просто ввели бы номера 1-0-0.
Для Вашего кода для обработки валют различной локали, необходимо получить максимальные дробные цифры валюты. Это может быть сделано со следующим фрагментом кода:
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
int currencyScale = [currencyFormatter maximumFractionDigits];
, Например, японская иена имеет максимальную дробную цифру 0. Так, при контакте с входом иены нет никакого десятичного разделителя и таким образом никакой потребности даже волноваться о дробных суммах.
Этот подход к проблеме позволяет Вам использовать запас числовая входная клавиатура, обеспеченная Apple без головных болей пользовательских клавиатур, regex проверка, и т.д.
Я хотел сделать точно то же самое, кроме с валютами, а не прямыми десятичными значениями.
я закончил тем, что создал пользовательское представление, которое содержит UITextField и UILabel. Маркировка покрывает текстовое поле, но текстовое поле все еще получает касания. Я использую уведомление UITextFieldTextDidChange для наблюдения изменений в текстовом поле (и я использовал NSNumberFormatter для превращения получающегося числа в отформатированное значение валюты) обновить маркировку.
Для отключения лупы, которая позволяет пользователю менять местоположение точки вставки необходимо будет использовать пользовательский подкласс UITextField и переопределить touchesBegan:withEvent: и набор это, чтобы ничего не сделать.
Мое решение могло бы отличаться от того, в чем Вы нуждаетесь, потому что десятичная точка всегда фиксируется - я использую установку валюты системы для определения, сколькими там цифры должны быть после десятичной точки. Однако цифровая клавиатура не имеет десятичной точки на нем. И Вы не можете добавить кнопки к клавиатуре (который особенно ухудшает, потому что существует пустая кнопка в нижнем левом углу клавиатуры, которая идеально подошла бы для десятичной точки!), Таким образом, у меня нет решения для этого, к сожалению.
В зависимости от определенного приложения, обеспечивая ползунок, из которого пользователь может выбрать положение, мог бы быть лучший выбор на iPhone. Тогда никакие цифры не должны быть введены вообще.
Можно хотеть использовать ползунок (как предложил Martin против LГ¶wis) или UIPickerView с отдельным колесом для каждой из цифр.
Вот пример решения, предложенного в принятом ответе. Это не работает с другими валютами или чем-то еще - в моем случае мне нужна была поддержка только для долларов, независимо от региона / валюты, поэтому для меня это было нормально:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
double currentValue = [textField.text doubleValue];
//Replace line above with this
//double currentValue = [[textField text] substringFromIndex:1] doubleValue];
double cents = round(currentValue * 100.0f);
if ([string length]) {
for (size_t i = 0; i < [string length]; i++) {
unichar c = [string characterAtIndex:i];
if (isnumber(c)) {
cents *= 10;
cents += c - '0';
}
}
} else {
// back Space
cents = floor(cents / 10);
}
textField.text = [NSString stringWithFormat:@"%.2f", cents / 100.0f];
//Add this line
//[textField setText:[NSString stringWithFormat:@"$%@",[textField text]]];
return NO;
}
Раунды и минимумы важны а) из-за плавающего- точечное представление иногда теряет 0,00001 или что-то еще и б) строку формата, округляющую любую точность, которую мы удалили в части возврата.
Я построил собственный контроллер представления цифровой панели с десятичной точкой ... проверьте это:
http://sites.google .com / site / psychopupnet / iphone-sdk / tenkeypadcustom10-keypadwithdecimal