web-dev-qa-db-fra.com

Formatage des flottants dans l'objectif C

J'ai besoin de formater un flottant (titre accrocheur, lui?) À 2 décimales, mais seulement si ces décimales ont des valeurs qui ne sont pas nulles. Exemple:

J'ai un NSTextField nommé 'answer', après avoir fait quelques calculs avec quelques flottants, je veux affecter ma variable 'answerFloat' à la 'answer' NSTextField. Jusqu'à présent, j'ai:

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

Mais cela définit quelque chose comme 45 à 45,00. Je veux que les nombres entiers soient affichés sans les zéros et que tous les nombres décimaux soient affichés avec leurs valeurs décimales respectives.

Dois-je exécuter une sorte de vérification avant de la donner à stringWithFormat? Ou NSString offre-t-il un moyen de gérer cela?

33
Adam Tootle

Avez-vous essayé le %g spécificateur de format?

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

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

45
Mark Bessey

Le problème avec% g est qu'il n'a pas de moyen de spécifier l'incrément d'arrondi (du moins, pas que je puisse trouver).

Vous pouvez utiliser NSNumberFormatter comme ceci pour obtenir votre résultat avec un nombre qui a un nombre indéfini de décimales.

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

Production:

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
23
Mark Suman

Recherchez NSNumberFormatter.

3
NSResponder

Pour une plus grande flexibilité, vous pouvez envisager d'implémenter une sous-classe personnalisée de NSFormatter . Il peut y avoir d'autres conseils saillants dans le Guide de programmation du formatage des données pour Cocoa .

2
mrkj