Search code examples
iosobjective-cnsnumberformatter

NSNumberFormatter - how do I truncate decimal places for high values?


I have set up an NSNumberFormatter as follows:

formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:2];
[formatter setMaximumFractionDigits:2];
[formatter setGroupingSize:3];

However, I want to amend it so that it doesn't show decimal places for values 100,000 or greater. Is this possible without creating another formatter?


Solution

  • If you want to truncate the decimal value of big numbers (print 324,329 instead of 324,329.12), here is what you can do.

    Create a category on NSNumberFormatter (New File > Objective-C Category), I called mine TruncateHigh. This will create two files, NSNumberFormatter+TruncateHigh.h and NSNumberFormatter+TruncateHigh.m.

    NSNumberFormatter+TruncateHigh.h :

    #import <Foundation/Foundation.h>
    
    @interface NSNumberFormatter (TruncateHigh)
    
    - (NSString *)customStringFromNumber:(NSNumber *)number;
    
    @end
    

    NSNumberFormatter+TruncateHigh.m :

    #import "NSNumberFormatter+TruncateHigh.h"
    
    @implementation NSNumberFormatter (TruncateHigh)
    
    - (NSString *)customStringFromNumber:(NSNumber *)number {
    
        if (number.floatValue > 100000) {
            [self setMaximumFractionDigits:0];
        } else {
            [self setMaximumFractionDigits:2];
        }
    
        return [self stringFromNumber:number];
    }
    
    @end
    

    Usage in YourViewController.m :

    #import "YourViewController.h"
    #import "NSNumberFormatter+TruncateHigh.h"
    
    @implementation YourViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
        [formatter setGroupingSize:3];
    
        NSNumber *smallNumber = [NSNumber numberWithFloat:12386.43];
        NSNumber *bigNumber = [NSNumber numberWithFloat:8567386.43];
    
        NSLog(@"Small Number : %@", [formatter customStringFromNumber:smallNumber]);
        NSLog(@"Big Number : %@", [formatter customStringFromNumber:bigNumber]);
    }
    
    @end
    

    Here is the log :

    test[7050:11303] Small Number : 12,386.43
    test[7050:11303] Big Number : 8,567,386
    

    This will print numbers lesser than 100000 with 2 decimal numbers, and numbers greater with no decimal value. You can customize the code to get it to work exactly as you want it to.

    Let me know if something's missing.