Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Here's how to do it without using floats, round() or ceil() in a currency agnostic manner.</p> <p>In you view controller, set up the following instance variables (with associated @property statements if that's your bag):</p> <pre><code>@interface MyViewController : UIViewController &lt;UITextFieldDelegate&gt; { @private UITextField *firstResponder; NSNumberFormatter *formatter; NSInteger currencyScale; NSString *enteredDigits; } @property (nonatomic, readwrite, assign) UITextField *firstResponder; @property (nonatomic, readwrite, retain) NSNumberFormatter *formatter; @property (nonatomic, readwrite, retain) NSString *enteredDigits; @end </code></pre> <p>and your viewDidLoad method should contain the following:</p> <pre><code>- (void)viewDidLoad { [super viewDidLoad]; NSNumberFormatter *aFormatter = [[NSNumberFormatter alloc] init]; [aFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; currencyScale = -1 * [aFormatter maximumFractionDigits]; self.formatter = aFormatter; [aFormatter release]; } </code></pre> <p>Then implement your UITextFieldDelegate methods as follows:</p> <pre><code>#pragma mark - #pragma mark UITextFieldDelegate methods - (void)textFieldDidBeginEditing:(UITextField *)textField { // Keep a pointer to the field, so we can resign it from a toolbar self.firstResponder = textField; self.enteredDigits = @""; } - (void)textFieldDidEndEditing:(UITextField *)textField { if ([self.enteredDigits length] &gt; 0) { // Get the amount NSDecimalNumber *result = [[NSDecimalNumber decimalNumberWithString:self.enteredDigits] decimalNumberByMultiplyingByPowerOf10:currencyScale]; NSLog(@"result: %@", result); } } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // Check the length of the string if ([string length]) { self.enteredDigits = [self.enteredDigits stringByAppendingFormat:@"%d", [string integerValue]]; } else { // This is a backspace NSUInteger len = [self.enteredDigits length]; if (len &gt; 1) { self.enteredDigits = [self.enteredDigits substringWithRange:NSMakeRange(0, len - 1)]; } else { self.enteredDigits = @""; } } NSDecimalNumber *decimal = nil; if ( ![self.enteredDigits isEqualToString:@""]) { decimal = [[NSDecimalNumber decimalNumberWithString:self.enteredDigits] decimalNumberByMultiplyingByPowerOf10:currencyScale]; } else { decimal = [NSDecimalNumber zero]; } // Replace the text with the localized decimal number textField.text = [self.formatter stringFromNumber:decimal]; return NO; } </code></pre> <p>Only tested this with pounds and pence, but it should work with Japanese Yen too. If you want to format decimals for non-currency purposes, then just read the documentation on <a href="http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Classes/NSNumberFormatter_Class/Reference/Reference.html" rel="nofollow" title="NSNumberFormatter">NSNumberFormatter</a> and set whatever format/maximumFractionDigits you want.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload