2010-01-13 10 views
30

Ho bisogno di formattare un float (titolo accattivante, lui?) In 2 posizioni decimali, ma solo se quelle posizioni decimali hanno valori che non sono zero. Esempio:Formattazione di oggetti fluttuanti nell'obiettivo C

Ho un NSTextField chiamato 'risposta', dopo che faccio qualche calcolo matematico con un paio di float, voglio assegnare la mia variabile 'answerFloat' al campo 'risposta' NSTextField. Finora ho:

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

Ma che imposta qualcosa come 45 a 45,00. Voglio che i numeri interi vengano visualizzati senza gli zeri e che tutti i numeri decimali vengano visualizzati con i rispettivi valori decimali.

Devo eseguire qualche tipo di controllo prima di darlo a stringWithFormat? O NSString offre un modo per gestire questo?

risposta

43

Hai provato l'identificatore di formato %g?

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

2010-01-12 19: 54: 38,651 foo [89.884: 10b] 45, 45,5

+0

In realtà pensavo di aver provato% g. Ho appena provato in questo modo: [answer setStringValue: [NSString stringWithFormat: @ "% 2.02g", answerFloat]]; e ha funzionato come un fascino. Grazie! –

+3

il problema con questo è che se il numero è abbastanza grande sarà messo in forma esponenziale. Non penso che ci sia un modo per ottenere questo comportamento solo con le stringhe di formato e senza rischiare una forma esponenziale. –

3

Cercare NSNumberFormatter.

+11

volevo solo dire che penso che le regole dei nomi. NSJoke eccezionale. – Sneakyness

+4

Si adatta al lavoro che ero solito fare in Apple. – NSResponder

+1

Si prega di rispondere con l'aiuto appropriato ed eventualmente con un esempio. Ancor di più se il tuo nome è NSResponder! Grazie per la tua collaborazione. – Anjaan

22

Il problema con% g è che non ha un modo per specificare l'incremento di arrotondamento (almeno, non che io possa trovare).

È possibile utilizzare NSNumberFormatter in questo modo per ottenere risultati con un numero con un numero indefinito di posizioni decimali.

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]); 

uscita:

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

Mark, brillante risposta e risolto un problema che ho cercato di risolvere per anni, grazie ;-) – user7865437

Problemi correlati