Question

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?

Était-ce utile?

La 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top