From 446eee1d99641fc55216be34842982c88e258a85 Mon Sep 17 00:00:00 2001 From: Andre Espeiorin Date: Thu, 22 Oct 2015 22:03:19 +0200 Subject: [PATCH 1/2] Fixed issue #3 from original repository --- FormattedCurrencyInput/ViewController.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/FormattedCurrencyInput/ViewController.m b/FormattedCurrencyInput/ViewController.m index fa54669..ca70ce8 100644 --- a/FormattedCurrencyInput/ViewController.m +++ b/FormattedCurrencyInput/ViewController.m @@ -123,8 +123,12 @@ - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange { NSDecimalNumber *textFieldTextNum = [NSDecimalNumber decimalNumberWithString:textFieldTextStr]; NSDecimalNumber *divideByNum = [[[NSDecimalNumber alloc] initWithInt:10] decimalNumberByRaisingToPower:numberFormatter.maximumFractionDigits]; - NSDecimalNumber *textFieldTextNewNum = [textFieldTextNum decimalNumberByDividingBy:divideByNum]; - NSString *textFieldTextNewStr = [numberFormatter stringFromNumber:textFieldTextNewNum]; + NSString *textFieldTextNewStr; + + if (!isnan(textFieldTextNum.doubleValue)) { + NSDecimalNumber *textFieldTextNewNum = [textFieldTextNum decimalNumberByDividingBy:divideByNum]; + textFieldTextNewStr = [numberFormatter stringFromNumber:textFieldTextNewNum]; + } textField.text = textFieldTextNewStr; From d66619107e8d2eb03e91b8ec2e121f2ec32c4a92 Mon Sep 17 00:00:00 2001 From: Andre Espeiorin Date: Thu, 22 Oct 2015 22:53:49 +0200 Subject: [PATCH 2/2] Improved the use of filter with more settings like suffix and custom formatters --- FormattedCurrencyInput/ViewController.h | 7 +- FormattedCurrencyInput/ViewController.m | 160 +++++++++++------- .../en.lproj/MainStoryboard.storyboard | 65 +++---- 3 files changed, 134 insertions(+), 98 deletions(-) diff --git a/FormattedCurrencyInput/ViewController.h b/FormattedCurrencyInput/ViewController.h index 0ef71d8..22c1882 100644 --- a/FormattedCurrencyInput/ViewController.h +++ b/FormattedCurrencyInput/ViewController.h @@ -8,9 +8,6 @@ #import -@interface ViewController : UIViewController +@interface ViewController : UIViewController -@property (strong, nonatomic) IBOutlet UITextField *textField; -- (IBAction)valueButton:(id)sender; - -@end +@end \ No newline at end of file diff --git a/FormattedCurrencyInput/ViewController.m b/FormattedCurrencyInput/ViewController.m index ca70ce8..22921d0 100644 --- a/FormattedCurrencyInput/ViewController.m +++ b/FormattedCurrencyInput/ViewController.m @@ -8,7 +8,22 @@ #import "ViewController.h" -@interface ViewController () +static NSUInteger const kMaxLength = 11; + +typedef NS_ENUM(NSUInteger, InputType) { + InputTypeRegular, + InputTypeSuffix +}; + +@interface ViewController () + +@property (nonatomic, weak) IBOutlet UITextField *textField; +@property (nonatomic, weak) IBOutlet UITextField *suffixField; + +@property (nonatomic, strong) NSNumberFormatter *regularFormatter; +@property (nonatomic, strong) NSNumberFormatter *suffixFormatter; + +- (IBAction)valueButton:(id)sender; @end @@ -16,52 +31,87 @@ @implementation ViewController @synthesize textField = _textField; +#pragma mark - View Life Cycle - (void)viewDidLoad { [super viewDidLoad]; - _textField.delegate = self; - NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; - [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; - [numberFormatter setMaximumFractionDigits:2]; - [numberFormatter setMinimumFractionDigits:2]; - - _textField.text = [numberFormatter stringFromNumber:[NSNumber numberWithInt:0]]; + self.textField.text = [self.regularFormatter stringFromNumber:@0]; + self.suffixField.text = [self.suffixFormatter stringFromNumber:@0]; } - (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; [self.textField becomeFirstResponder]; } -- (void)didReceiveMemoryWarning +#pragma mark - Accessors +- (NSNumberFormatter *) regularFormatter { - [super didReceiveMemoryWarning]; + if (_regularFormatter) + { + return _regularFormatter; + } + + _regularFormatter = [[NSNumberFormatter alloc] init]; + _regularFormatter.numberStyle = NSNumberFormatterCurrencyStyle; + _regularFormatter.maximumFractionDigits = 2; + _regularFormatter.minimumFractionDigits = 2; + + return _regularFormatter; } -- (IBAction)valueButton:(id)sender +- (NSNumberFormatter *) suffixFormatter { - NSString *textFieldStr = [NSString stringWithFormat:@"%@", _textField.text]; + if (_suffixFormatter) + { + return _suffixFormatter; + } - NSMutableString *textFieldStrValue = [NSMutableString stringWithString:textFieldStr]; + _suffixFormatter = [[NSNumberFormatter alloc] init]; + _suffixFormatter.numberStyle = NSNumberFormatterCurrencyStyle; + _suffixFormatter.positiveFormat = @"#,##0.00¤"; + _suffixFormatter.negativeFormat = @"(#,##0.00¤"; + _suffixFormatter.currencySymbol = @"YTL"; - NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; - [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; + return _suffixFormatter; +} - [textFieldStrValue replaceOccurrencesOfString:numberFormatter.currencySymbol - withString:@"" - options:NSLiteralSearch - range:NSMakeRange(0, [textFieldStrValue length])]; - - [textFieldStrValue replaceOccurrencesOfString:numberFormatter.groupingSeparator - withString:@"" - options:NSLiteralSearch - range:NSMakeRange(0, [textFieldStrValue length])]; +#pragma mark - private +- (NSString *) valueFromString:(NSString *)string +{ + NSCharacterSet *valueSet= [[NSCharacterSet characterSetWithCharactersInString:@"0123456789,."] invertedSet]; + return [[[string componentsSeparatedByCharactersInSet:valueSet] componentsJoinedByString:@""] mutableCopy]; +} + +- (NSString *) numberFromString:(NSString *)string +{ + NSCharacterSet *numberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]; + return [[[string componentsSeparatedByCharactersInSet:numberSet] componentsJoinedByString:@""] mutableCopy]; +} - NSDecimalNumber *textFieldNum = [NSDecimalNumber decimalNumberWithString:textFieldStrValue]; +- (NSDecimalNumber *) dividerForFormatter:(NSNumberFormatter *)formatter +{ + return [[[NSDecimalNumber alloc] initWithInt:10] decimalNumberByRaisingToPower:formatter.maximumFractionDigits]; +} + +- (NSString *) alertTextForField:(UITextField *)field formatter:(NSNumberFormatter *)formatter +{ + NSDecimalNumber *textFieldNum = [NSDecimalNumber decimalNumberWithString:[self numberFromString:field.text]]; + textFieldNum = [textFieldNum decimalNumberByDividingBy:[self dividerForFormatter:formatter]]; + return [NSString stringWithFormat:@"Value:%@\nNumber:%@", field.text, textFieldNum]; +} + +#pragma mark - Action +- (IBAction)valueButton:(id)sender +{ + NSString *regular = [self alertTextForField:self.textField formatter:self.regularFormatter]; + NSString *suffix = [self alertTextForField:self.suffixField formatter:self.suffixFormatter]; + NSString *message = [NSString stringWithFormat:@"Regular\n%@\n\nSuffix\n%@", regular, suffix]; UIAlertView* alert = [[UIAlertView alloc] initWithTitle:nil - message:[NSString stringWithFormat:@"Value: %@, Number: %@", textFieldStr, textFieldNum] + message:message delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; @@ -70,30 +120,24 @@ - (IBAction)valueButton:(id)sender - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string { - NSInteger MAX_DIGITS = 11; // $999,999,999.99 + NSNumberFormatter *formatter; - NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; - [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; - [numberFormatter setMaximumFractionDigits:2]; - [numberFormatter setMinimumFractionDigits:2]; + if (textField.tag == InputTypeSuffix) + { + formatter = self.suffixFormatter; + } + else + { + formatter = self.regularFormatter; + } NSString *stringMaybeChanged = [NSString stringWithString:string]; if (stringMaybeChanged.length > 1) { NSMutableString *stringPasted = [NSMutableString stringWithString:stringMaybeChanged]; - - [stringPasted replaceOccurrencesOfString:numberFormatter.currencySymbol - withString:@"" - options:NSLiteralSearch - range:NSMakeRange(0, [stringPasted length])]; - - [stringPasted replaceOccurrencesOfString:numberFormatter.groupingSeparator - withString:@"" - options:NSLiteralSearch - range:NSMakeRange(0, [stringPasted length])]; - + stringPasted = [[self numberFromString:stringPasted] mutableCopy]; NSDecimalNumber *numberPasted = [NSDecimalNumber decimalNumberWithString:stringPasted]; - stringMaybeChanged = [numberFormatter stringFromNumber:numberPasted]; + stringMaybeChanged = [formatter stringFromNumber:numberPasted]; } UITextRange *selectedRange = [textField selectedTextRange]; @@ -102,32 +146,24 @@ - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange NSMutableString *textFieldTextStr = [NSMutableString stringWithString:textField.text]; NSUInteger textFieldTextStrLength = textFieldTextStr.length; - [textFieldTextStr replaceCharactersInRange:range withString:stringMaybeChanged]; - - [textFieldTextStr replaceOccurrencesOfString:numberFormatter.currencySymbol - withString:@"" - options:NSLiteralSearch - range:NSMakeRange(0, [textFieldTextStr length])]; - - [textFieldTextStr replaceOccurrencesOfString:numberFormatter.groupingSeparator - withString:@"" - options:NSLiteralSearch - range:NSMakeRange(0, [textFieldTextStr length])]; + NSUInteger originalLength = textFieldTextStr.length; + textFieldTextStr = [[self valueFromString:textFieldTextStr] mutableCopy]; + NSUInteger newLength = textFieldTextStr.length; + range.location += newLength - originalLength; - [textFieldTextStr replaceOccurrencesOfString:numberFormatter.decimalSeparator - withString:@"" - options:NSLiteralSearch - range:NSMakeRange(0, [textFieldTextStr length])]; + [textFieldTextStr replaceCharactersInRange:range withString:stringMaybeChanged]; + textFieldTextStr = [[self numberFromString:textFieldTextStr] mutableCopy]; - if (textFieldTextStr.length <= MAX_DIGITS) + if (textFieldTextStr.length <= kMaxLength) { NSDecimalNumber *textFieldTextNum = [NSDecimalNumber decimalNumberWithString:textFieldTextStr]; - NSDecimalNumber *divideByNum = [[[NSDecimalNumber alloc] initWithInt:10] decimalNumberByRaisingToPower:numberFormatter.maximumFractionDigits]; + NSDecimalNumber *divideByNum = [self dividerForFormatter:formatter]; NSString *textFieldTextNewStr; - if (!isnan(textFieldTextNum.doubleValue)) { + if (!isnan(textFieldTextNum.doubleValue)) + { NSDecimalNumber *textFieldTextNewNum = [textFieldTextNum decimalNumberByDividingBy:divideByNum]; - textFieldTextNewStr = [numberFormatter stringFromNumber:textFieldTextNewNum]; + textFieldTextNewStr = [formatter stringFromNumber:textFieldTextNewNum]; } textField.text = textFieldTextNewStr; diff --git a/FormattedCurrencyInput/en.lproj/MainStoryboard.storyboard b/FormattedCurrencyInput/en.lproj/MainStoryboard.storyboard index 0d64ddf..bba7db5 100644 --- a/FormattedCurrencyInput/en.lproj/MainStoryboard.storyboard +++ b/FormattedCurrencyInput/en.lproj/MainStoryboard.storyboard @@ -1,52 +1,72 @@ - + - - - + + + + + + - + + + + + + + + + + + + + + + + - - - - + + + + + + + + @@ -55,21 +75,4 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file +