2009-02-08 8 views
10

Estoy usando la siguiente pieza del código Objective-C para formatear un NSNumber, y funciona bien la mayor parte del tiempo, pero no hace exactamente lo que quiero cuando el objeto NSNumber contiene un entero (sin parte fraccionaria) .¿Cómo especificar lugares decimales al formatear objetos NSNumber?

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)]; 
label.backgroundColor = [UIColor clearColor]; 
label.textColor = [UIColor whiteColor]; 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setFormat:@"###.##"]; 
int bytes = 1024 * 1024; 
NSNumber *total = [NSNumber numberWithFloat:([self.totalFileSize floatValue]/bytes)]; 
label.text = [NSString stringWithFormat:@"0.00 MB of %@ MB", [formatter stringFromNumber:total]]; 

Así por ejemplo, si self.totalFileSize sostiene 55.2300, se mostrará "55.23" como debe ser en mi UILabel. Pero si esa misma variable tiene 55, simplemente mostrará "55" en la etiqueta.

Lo que realmente quiero es que este código siempre incluya los 2 decimales en la salida.

¿Cómo puedo lograr eso?

Respuesta

16

Su cadena de formato debe tener un "0" por cada decimal que desee que exista siempre.

[formatter setFormat:@"###.00"]; 

para "55.23" y "0,23" y" 0,20"

[formatter setFormat:@"##0.00"]; 

para "55.23" y "0,23" y "0,20"

Ver Number Format String Syntax (Mac OS X Versions 10.0 to 10.3)

O puede usar un formateador 10.4 con - setMinimumFractionDigits: y - setMaximumFractionDigits: con ambos establecidos en 2.

+5

setFormat: no está disponible para iOS (podría funcionar en el simulador, pero no en el dispositivo). Necesita usar setPositiveFormat: y setNegativeFormat: –

+0

en iOS necesita usar 'setMinimumFractionDigits:' y/o - 'setMaximumFractionDigits:' – Laszlo

7

Creo que lo que busca es: "% .2f"

peor de los casos, se puede dividir el valor, compruebe si hay algo después de la coma decimal. Si no hay agregar el 00 a mano?

+1

Creo que lo que usted quiso decir usted cree que lo que está buscando es: "% .2f";) – schnaader

+0

Usar eso no hará lo que cree que ocurrirá, ya que pasar un objeto NSNumber a NSLog hará que llame [obj description], que devuelve una cadena . En cualquier caso, estoy tratando de evitar hacks como el "append 00 si no está allí". Estoy seguro de que NSNumberFormatter tiene una función para hacer lo que quiero aquí. – jpm

+0

@Garret, estaba desesperado por encontrar esta solución simple. El formateo numérico no es fácil. Gracias. – JFS

3

Usted puede ser mejor con localizedStringWithFormat, al igual que ...

[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)]; 
label.backgroundColor = [UIColor clearColor]; 
label.textColor = [UIColor whiteColor]; 
int bytes = 1024 * 1024; 
label.text = [NSString localizedStringWithFormat:@"0.00 MB of %.2f MB", ([self.totalFileSize floatValue]/bytes)]; 

Y, por supuesto, bytes podría ser un const unsigned y clearColor tiende a ser un cerdo de rendimiento, pero aquellos son problemas para otro hilo.

+0

¿Cuál es el problema con el uso de 'clearColor' y qué sería mejor? ¡Muchas gracias! – JFS

+0

gracias por la pista 'localizedStringWithFormat'. Estaba buscando desesperadamente una forma fácil de garantizar el separador decimal localizado. – JFS

Cuestiones relacionadas