Ios numberformatter currency removes trailing decimal numbers if 0

I want to format the number in the currency string. These are the following cases:

25.00 => $25 25.43 => $25.43 25.4 => $25.40 0.00 -> $0 

Is there a way to do this in NSNumberFormatter ?

This is my code right now:

 NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; [fmt setNumberStyle:NSNumberFormatterCurrencyStyle]; [fmt setCurrencyCode:@"USD"]; 

However, this fails for my first and last examples.

I also tried:

 NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; [fmt setPositiveFormat:@"$0.##"]; 

However, this is not suitable for my third case. Any suggestions?

+6
source share
3 answers

I don't think there is a way to do this using a simple NSNumberFormatter . You can set the minimum and maximum digits to 0 only for formatting integers in a subclass of NSNumberFormatter :

 @interface MyCurrencyFormatter : NSNumberFormatter @end @implementation MyCurrencyFormatter - (id)init { if ((self = [super init])) { [self setNumberStyle:NSNumberFormatterCurrencyStyle]]; [self setCurrencyCode:@"USD"]; } return self; } - (NSString *)stringFromNumber:(NSNumber *)aNumber { NSInteger minimumFractionDigits = [self minimumFractionDigits]; NSInteger maximumFractionDigits = [self maximumFractionDigits]; if ([self isInteger:aNumber]) { [self setMinimumFractionDigits:0]; [self setMaximumFractionDigits:0]; } NSString *formattedNumber = [super stringFromNumber:aNumber]; [self setMinimumFractionDigits:minimumFractionDigits]; [self setMaximumFractionDigits:maximumFractionDigits]; return formattedNumber; } - (BOOL)isInteger:(NSNumber *)aNumber { NSDecimal decimalValue = aNumber.decimalValue; NSDecimalRound(&decimalValue, &decimalValue, 0, NSRoundDown); NSDecimalNumber *roundedValue = [[NSDecimalNumber alloc] initWithDecimal:decimalValue] return [aNumber isEqualToNumber:roundedValue]; } @end 

It should also handle international formats.

Confirm this post to determine if a number is an integer.

+5
source

Change the number of digits of the fraction based on whether the number is an integer.

 - (NSString *)stringFromNumber:(NSNumber *)number { BOOL isWholeNumber = (roundf(number.doubleValue) == number.doubleValue); self.currencyNumberFormatter.maximumFractionDigits = self.currencyNumberFormatter.minimumFractionDigits = isWholeNumber ? 0 : 2; NSString *str = [self.currencyNumberFormatter stringFromNumber:number]; return str; } 
+8
source

I am using the following solution in Swift. It is based on jowie's answer, except that I don't want to change maxFractionDigits if my number is not an integer. In some countries, more than two digits are used for prices.

 if(price==price.decimalNumberByRoundingAccordingToBehavior(nil)) { numberFormatter.maximumFractionDigits=0 numberFormatter.minimumFractionDigits=0 } let priceStr = numberFormatter.stringFromNumber(price)! 
+3
source

All Articles