Для простого ввода валюты в стиле банкомата, я использую следующий код, который работает довольно хорошо: , если , вы используете опцию UIKeyboardTypeNumberPad
, которая разрешает только цифры и символы возврата.
Сначала настройте NSNumberFormatter
так:
NSNumberFormatter* currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormatter setMaximumSignificantDigits:9]; // max number of digits including ones after the decimal here
Затем используйте следующий код shouldChangeCharactersInRange:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString* newText = [[[[textField.text stringByReplacingCharactersInRange:range withString:string] stringByReplacingOccurrencesOfString:currencyFormatter.currencySymbol withString:[NSString string]] stringByReplacingOccurrencesOfString:currencyFormatter.groupingSeparator withString:[NSString string]] stringByReplacingOccurrencesOfString:currencyFormatter.decimalSeparator withString:[NSString string]];
NSInteger newValue = [newText integerValue];
if ([newText length] == 0 || newValue == 0)
textField.text = nil;
else if ([newText length] > currencyFormatter.maximumSignificantDigits)
textField.text = textField.text;
else
textField.text = [currencyFormatter stringFromNumber:[NSNumber numberWithDouble:newValue / 100.0]];
return NO;
}
Большая часть работы выполняется при установке значения newText
; предлагаемое изменение используется, но все нецифровые символы, введенные NSNumberFormatter
, удаляются.
Тогда первый if test проверяет, является ли текст пустым или все нули (помещаются туда пользователем или форматером). Если нет, следующий тест проверяет, что никакие входные данные, кроме обратных символов, не будут приняты, если число уже имеет максимальное количество цифр.
Последняя строка повторно отображает число с использованием средства форматирования, поэтому пользователь всегда видит что-то вроде $1,234.50
. Обратите внимание, что я использую $0.00
для текста заполнителя с этим кодом, поэтому при установке значения nil отображается текст заполнителя.