A small snippet of code that uses a UITextField like an ATM keypad. E.g. You start typing in a sequence like this:
£0.00 -> £0.02 -> £0.20 -> £2.05 -> £20.50
Elsewhere define and store a reference to a NSNumberFormatter like so:
self.en_GB = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; self.paymentFormatter = [[NSNumberFormatter alloc] init]; [self.paymentFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [self.paymentFormatter setLocale:self.en_GB]; [self.paymentFormatter setGeneratesDecimalNumbers:YES];
Then as a delegate method to the UITextField:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSMutableString *mutableString = [[textField text] mutableCopy]; if ([mutableString length] == 0) { [mutableString setString:[self.en_GB objectForKey:NSLocaleCurrencySymbol]]; [mutableString appendString:string]; } else { if ([string length] > 0) { [mutableString insertString:string atIndex:range.location]; } else { [mutableString deleteCharactersInRange:range]; } } NSString *penceString = [[[mutableString stringByReplacingOccurrencesOfString: [self.en_GB objectForKey:NSLocaleDecimalSeparator] withString:@""] stringByReplacingOccurrencesOfString: [self.en_GB objectForKey:NSLocaleCurrencySymbol] withString:@""] stringByReplacingOccurrencesOfString: [self.en_GB objectForKey:NSLocaleGroupingSeparator] withString:@""]; self.paymentPence = [NSDecimalNumber decimalNumberWithString:penceString]; [textField setText:[self.paymentFormatter stringFromNumber:[self.paymentPence decimalNumberByMultiplyingByPowerOf10:-2]]]; return NO; }
I want to keep the amount in pence, hence the self.paymentPence property. On the off-chance that the UK moves to the € I also use a NSLocale instance to make sure Decimal Separators, Currency Separators and Symbols are correct rather than hard coded.
2 Responses to Using a UITextField like an ATM keypad.