La moneda del formatting numérico ios elimina los decimales finales si 0

Quiero formatear mi número en una cadena de moneda. Estos son los siguientes casos

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

¿Hay alguna forma de hacer esto en NSNumberFormatter ?

Este es mi código en este momento:

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

Sin embargo, eso falla para mi primer y último ejemplo.

También probé:

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

Sin embargo, eso falla para mi tercer caso. ¿Alguna sugerencia?

No creo que haya una manera de hacerlo usando un simple NSNumberFormatter . Puede establecer los dígitos de fracción mínima y máxima en 0 solo para formatear integers en una subclass de 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 

Esto también debe manejar formattings de numbers internacionales.

Crédito a esta publicación para determinar si un número es un número integer.

Cambia el número de dígitos de fracciones en function de si el número es o no completo.

 - (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; } 

Estoy usando la siguiente solución en Swift. Se basa en la respuesta de Jowie, excepto que no quiero cambiar maximumFractionDigits si mi número no es completo. En algunos países se utilizan más de 2 dígitos para los precios.

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