Skip to content
This repository was archived by the owner on Apr 6, 2024. It is now read-only.
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 40 additions & 27 deletions FormattedCurrencyInput/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,17 @@ @implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_textField.delegate = self;
_textField.delegate = self;

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];


NSString *currencySymbol = [[numberFormatter currencySymbol] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[numberFormatter setPositivePrefix:currencySymbol];
[numberFormatter setPositiveSuffix:@""];

_textField.text = [numberFormatter stringFromNumber:[NSNumber numberWithInt:0]];
}

Expand All @@ -42,24 +46,28 @@ - (void)didReceiveMemoryWarning
- (IBAction)valueButton:(id)sender
{
NSString *textFieldStr = [NSString stringWithFormat:@"%@", _textField.text];

NSMutableString *textFieldStrValue = [NSMutableString stringWithString:textFieldStr];

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

[textFieldStrValue replaceOccurrencesOfString:numberFormatter.currencySymbol
NSString *currencySymbol = [[numberFormatter currencySymbol] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[numberFormatter setPositivePrefix:currencySymbol];
[numberFormatter setPositiveSuffix:@""];

[textFieldStrValue replaceOccurrencesOfString:currencySymbol
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0, [textFieldStrValue length])];

[textFieldStrValue replaceOccurrencesOfString:numberFormatter.groupingSeparator
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0, [textFieldStrValue length])];

NSDecimalNumber *textFieldNum = [NSDecimalNumber decimalNumberWithString:textFieldStrValue];

UIAlertView* alert = [[UIAlertView alloc] initWithTitle:nil
message:[NSString stringWithFormat:@"Value: %@, Number: %@", textFieldStr, textFieldNum]
delegate:nil
Expand All @@ -71,63 +79,68 @@ - (IBAction)valueButton:(id)sender
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
{
NSInteger MAX_DIGITS = 11; // $999,999,999.99

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];


// Set currency symbol as prefix
NSString *currencySymbol = [[numberFormatter currencySymbol] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[numberFormatter setPositivePrefix:currencySymbol];
[numberFormatter setPositiveSuffix:@""];

NSString *stringMaybeChanged = [NSString stringWithString:string];
if (stringMaybeChanged.length > 1)
{
NSMutableString *stringPasted = [NSMutableString stringWithString:stringMaybeChanged];
[stringPasted replaceOccurrencesOfString:numberFormatter.currencySymbol

[stringPasted replaceOccurrencesOfString:currencySymbol
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0, [stringPasted length])];

[stringPasted replaceOccurrencesOfString:numberFormatter.groupingSeparator
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0, [stringPasted length])];

NSDecimalNumber *numberPasted = [NSDecimalNumber decimalNumberWithString:stringPasted];
stringMaybeChanged = [numberFormatter stringFromNumber:numberPasted];
}

UITextRange *selectedRange = [textField selectedTextRange];
UITextPosition *start = textField.beginningOfDocument;
NSInteger cursorOffset = [textField offsetFromPosition:start toPosition:selectedRange.start];
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:currencySymbol
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0, [textFieldTextStr length])];

[textFieldTextStr replaceOccurrencesOfString:numberFormatter.groupingSeparator
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0, [textFieldTextStr length])];

[textFieldTextStr replaceOccurrencesOfString:numberFormatter.decimalSeparator
withString:@""
options:NSLiteralSearch
range:NSMakeRange(0, [textFieldTextStr length])];

if (textFieldTextStr.length <= MAX_DIGITS)
{
NSDecimalNumber *textFieldTextNum = [NSDecimalNumber decimalNumberWithString:textFieldTextStr];
NSDecimalNumber *divideByNum = [[[NSDecimalNumber alloc] initWithInt:10] decimalNumberByRaisingToPower:numberFormatter.maximumFractionDigits];
NSDecimalNumber *textFieldTextNewNum = [textFieldTextNum decimalNumberByDividingBy:divideByNum];
NSString *textFieldTextNewStr = [numberFormatter stringFromNumber:textFieldTextNewNum];

textField.text = textFieldTextNewStr;

if (cursorOffset != textFieldTextStrLength)
{
NSInteger lengthDelta = textFieldTextNewStr.length - textFieldTextStrLength;
Expand All @@ -137,7 +150,7 @@ - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange
[textField setSelectedTextRange:newRange];
}
}

return NO;
}

Expand Down