2010-01-13 7 views
30

Necesito formatear un flotante (título pegadizo, él?) A 2 decimales, pero solo si esos lugares decimales tienen valores que no son cero. Ejemplo:Formateando carrozas en el Objetivo C

Tengo un NSTextField llamado 'respuesta', después de hacer algunos cálculos con un par de flotantes, quiero asignar mi variable 'answerFloat' a la 'respuesta' NSTextField. Hasta ahora tengo:

[answer setStringValue:[NSString stringWithFormat:@"%.2f", answerFloat]]; 

Pero eso establece algo así como 45 a 45.00. Quiero que se muestren los números enteros sin los ceros y los números decimales que se mostrarán con sus respectivos valores decimales.

¿Debo ejecutar algún tipo de comprobación antes de pasarlo a stringWithFormat? ¿O NSString ofrece una forma de manejar esto?

Respuesta

43

¿Has probado el especificador de formato %g?

NSLog([NSString stringWithFormat:@"%g, %g", 45.0, 45.5]); 

2010-01-12 19: 54: 38.651 foo [89884: 10b] 45, 45,5

+0

De hecho, pensé que había intentado% g. Lo intenté así: [answer setStringValue: [NSString stringWithFormat: @ "% 2.02g", answerFloat]]; y funcionó a las mil maravillas. ¡Gracias! –

+3

el problema con esto es que si el número es lo suficientemente grande se pondrá en forma exponencial. No creo que exista una forma de obtener este comportamiento solo con cadenas de formato y sin riesgo de forma exponencial. –

3

Busque NSNumberFormatter.

+11

sólo quería decir que creo que las reglas de su nombre. Awesome NSJoke. – Sneakyness

+4

Encaja con el trabajo que solía hacer en Apple. – NSResponder

+1

Responda con la ayuda adecuada y posiblemente con un ejemplo. ¡Aún más si tu nombre es NSResponder! Gracias por su cooperación. – Anjaan

22

El problema con% g es que no tiene forma de especificar el incremento de redondeo (al menos, no es que yo pueda encontrarlo).

Puede usar NSNumberFormatter de esta manera para obtener su resultado con un número que tenga un número indefinido de decimales.

double none = 5; 
double one = 5.1; 
double two = 5.01; 
double lots = 5.918286558251858392107584219; 

NSNumber *numberNone = [NSNumber numberWithDouble:none]; 
NSNumber *numberOne = [NSNumber numberWithDouble:one]; 
NSNumber *numberTwo = [NSNumber numberWithDouble:two]; 
NSNumber *numberLots = [NSNumber numberWithDouble:lots]; 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
formatter.roundingIncrement = [NSNumber numberWithDouble:0.01]; 
formatter.numberStyle = NSNumberFormatterDecimalStyle; 

NSLog(@"%@",[formatter stringFromNumber:numberNone]); 
NSLog(@"%@",[formatter stringFromNumber:numberOne]); 
NSLog(@"%@",[formatter stringFromNumber:numberTwo]); 
NSLog(@"%@",[formatter stringFromNumber:numberLots]); 

Salida:

2012-02-15 16:21:17.469 AwakeFromNib[53043:f803] 5 
2012-02-15 16:21:17.470 AwakeFromNib[53043:f803] 5.1 
2012-02-15 16:21:17.470 AwakeFromNib[53043:f803] 5.01 
2012-02-15 16:21:17.471 AwakeFromNib[53043:f803] 5.92 
+1

Marca, respuesta brillante y resolvió un problema que he intentado solucionar durante años, gracias ;-) – user7865437